查看关键main()函数,发现gets(&v11)存在栈溢出,
进入sub_C3E()函数,确定满足条件即可cat flag。
题目要求,先输入name,然后连续十次猜对数字得到flag, 进入V11,在栈中占0x20,可以覆盖到seed,使seed[0]已知,后使输入的v8等于随机数v10,拿到flag。
注:(1)在调用rang()时,先利用srand()设好随机数种子,若未设置,rand()在调用的时候会自动设为1.
(2)libc共享库:可以使用命令 ldd guess_num 查找
(3)如何在脚本中调用动态库中的程序:python库ctypes模块,使用cdll.LoadLibrary('')
(4)什么情况程序在编译前加载了动态库:比如我们在使用print家族、puts等未在程序里声明的函数,需要通过引用动态库里面就有程序不用声明就能进行调用的函数。
exp:
解释:引入pwn、ctypes模块;remote连接其他主机服务;elf=ELF(bin路径)本地运行pwn文件;libc调用动态库;构造payload,随机数a覆盖到seed[0],设定随机数种子为1;recvuntil()接收字符串;sendline(payload)发送payload;srand(1)设定随机数种子为1;循环十次;interactive()直接进行交互;
另一种方式:利用C程序,直接覆盖seed,爆出随机数,得到flag.
cyberpeace{c89cf2a54c56f16458a1164851a361b4}