[Pwn]攻防世界pwn题目wp--guess

    科技2022-07-11  163

    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语言脚本进行覆盖

    #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

    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

    Processed: 0.019, SQL: 8