HGAME-2018

week1

【pwn】

0x1 guess_number


下载二进制文件,扔到IDA中,F5反汇编一下:




可以看出,这里用了一个sacnf函数,明显存在一个溢出漏洞,那么这道题的关键就是去覆盖a1这个变量,让输入变量nptr==a1,这样就可以得到flag

再去看看栈空间的变量位置分布,



可知,覆盖满0x10c大小的nptr后还需要再覆盖0x08大小的空间才能达到a1变量的空间

因此覆盖量为0x10c+0x08,因此可得出shellcode:


然后就搞出flag了。。。。额。。时间过了,提交了也没分-_-!


0x02 flag_server



按照老套路,扔到IDA里面去看看



通过看代码可以发现,首先是输入一个十进制的整数变量v5,并且整个整数不能大于63并且不能等于0,否则会进行重新输入,接着读取v5个字符串到s1变量里面去,然后在判断读进去的s1字符串是不是等于“admin”,如果是,那么搞出一个随机数v7,然后让你在输入一个v6变量去猜随机数v7,如果猜对了,那么就能使变量v9=1,从而得到flag

通过上面的分析,我们基本上有两条路子去解决问题,第一,去猜随机数,猜对了就能拿到flag,如果是伪随机数,是可以猜出来的,但是有init函数,随机数是由/dev/urandom提供,那么就没办法去猜了


因此只能采用第二种方法,就是去通过溢出来去覆盖关键的变量,纵观整道题,最关键的变量实际上就是v9,只要让它不为0,那么就能执行cat flag命令,于是去找v9在栈中的位置


于是去找找溢出点,通过提示中的“负数溢出”,可以试试将-1赋值给v5,从而满足了小于等于63并且不为零的条件,通过 read_n函数,读取足够多的字符串s1的栈空间中,一直覆盖到v9的栈空间,就可以使得v9不为零,从而拿到flag

于是我们找到s1在栈中的位置


可以算出,从s1覆盖到v9,需要0x50-0x10=0x40长度的字符串,也就是64个字符串

于是shellcode就是这样的(懒得写脚本了,就直接瞎打):




你可能感兴趣的:(PWN,wp)