收获

  • 使用 ctypes 库生成伪随机数

(2023年4月16日)【GDOUCTF 2023】真男人下120层


思路

首先查看文件:

2023GDOUCTF-真男人就下120层1.png

用 IDA 查看代码逻辑:

2023GDOUCTF-真男人就下120层2.png

输出信息有点杂乱,运行程序看一下:

2023GDOUCTF-真男人就下120层3.png

这样就看得很清楚了,结合代码,程序大意如下:

  1. 首先根据一些数据生成伪随机数种子
  2. 让我们输入满足 if ( rand() % 4 + 1 != v6 ) 条件的 v6
  3. 总共有 120 轮这样的校验,如果全部正确就执行 cat_flag() 函数

cat_flag() 函数如下:

2023GDOUCTF-真男人就下120层4.png

所以接下来思路就很清晰了,按照伪随机数生成的方法构造 exp 重复输入 120 次即可


脚本

from pwn import *
from ctypes import *  # 导入ctypes库使Python可以执行C语言的函数

context(os='linux', arch='amd64', log_level='debug')  # 打印调试信息
content = 0  # 本地Pwn通之后,将content改成0,Pwn远程端口

if content == 1:
    io = process("/home/wyy/桌面/PWN/真男人下120层/bin")  # 程序在Linux的路径
else:
    io = remote("node4.anna.nssctf.cn", 28625)  # 题目的远程端口,注意是remote


def srand():
    lib = cdll.LoadLibrary("/lib/x86_64-linux-gnu/libc.so.6")  # C运行库
    v3 = lib.time(0)
    lib.srand(v3)
    v4 = lib.rand()
    lib.srand(v4 % 3 - 1522127470)

    for i in range(120):
        number = str(lib.rand() % 4 + 1)  # 执行随机函数
        io.recvuntil("\n\n")
        io.sendline(number)


srand()
io.interactive()  # 接收回显

结果

NSSCTF{bc2875e3-3232-4f70-8b78-006e8527f928}

2023GDOUCTF-真男人就下120层5.png