题目
附件:
两个文件client和server
Get Flag
Exeinfo File分析
file client
client: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=6045aa1ba5c8d0817e9452e6929eadff0b546f3d, not stripped
分析:
-
client 是一个 ELF 格式的可执行程序,运行在 64 位 Linux 系统上,目标架构是 x86-64。
-
PIE 和 ASLR:由于它是 PIE 可执行文件,程序加载地址会随机化,这导致你在 GDB 调试时需要处理地址偏移(如 0x246d 变成 0x55555540246d)。
-
动态链接:client 依赖外部共享库(如 libstdc++.so),因此运行时需要这些库存在系统中。
-
调试信息:not stripped 意味着可以直接使用 GDB 访问符号(如 main、glod),无需额外的调试符号文件。
-
与 server 的交互:client 程序通过网络连接(get_nc() 和 get_flag(nc))与 server 通信,server 监听在端口 8888。
运行文件体验下
# unbuntu
chmod +x ./client
./client
# 输入页面给的服务器及端口:61.147.171.105 50358
程序就是wasd移动,走到不同标记(* $ @ )下方,输入j回车,会有不同反应。
IDA反编译为C文件
在Hello_CTF中:
idax64打开client,然后file-Produce File-Create C File 生成反编译的C文件(伪代码);
分析client.c
全局检索flag,可以看到判断是否可以获取flag的条件:
条件是:输入j,此时在@下方并且glod>1000000
case 'j':...if ( (_UNKNOWN *)s[100 * v0 - 100 + v1] == &unk_963B && glod > 100000000 ){puts("GET_FLAG!");nc = get_nc();get_flag(nc);getchar();}
gdb改glod,获取flag
Ubuntu中:
gdb ./client
(gdb) start #运行,并在入口处暂停
Temporary breakpoint 1, 0x0000555555409349 in main ()# 由于程序启用了PIE(Position Independent Executable,位置无关可执行文件)所以要用偏移地址
# 上方显示main入口是0x0000555555409349
# 查看glob地址
(gdb) print &glod
$1 = (<data variable, no debug info> *) 0x55555560a388 <glod># 这里要注意,**not stripped**:保留调试符号,如果是stripped, 需要使用偏移量计算glod地址# 设置glod值大于100000000
(gdb) info variables glod
All variables matching regular expression "glod":Non-debugging symbols:
0x000055555560a388 glod
(gdb) set {int}0x55555560a388 = 100000001
(gdb) x/d 0x000055555560a388
0x55555560a388 <glod>: 100000001(gdb) continue
# 输入页面给的服务器及端口:61.147.171.105 50358
移动到@下方输入j回车, 得到Flag,注意要把窗口向上移动一下,被翻页挡住了…