day1

 pwnable

flag

 64位可执行文件,放入IDA后程序表现很奇怪,使用strings命令,发现程序存在UPX的字符串,所以是经过UPX压缩的程序,用upx -d解压缩再用IDA打开即可看到程序的正确汇编代码。flag以明文形式放在了内存中。

passcode

 查看源代码后,发现本体需要从标准输入流输入两个数字,使得其匹配passcode的值,但本题的scanf函数的第二个参数没有加&,因此scanf函数会将这个变量的值作为一个地址将数据写入,所以直接输入passcode匹配的值是不可行的,本题需要进行got覆盖。可以看到在主函数中连续调用了welcome函数和login函数,在welcome中要求输入name字符串,而welcome与login是连续调用的,所以在堆栈平衡的情况下,welcome函数与login函数的堆栈中ebp相等,所以可以利用name来覆盖之后的passcode1。具体思路是,将passcode1覆盖为之后要执行的某个函数的got地址,在scanf对passcode1进行输入时即可覆盖原函数的地址,将这个地址覆盖为system调用处。首先通过objdump -d反汇编程序,发现system函数调用的地址为0x80485e3,而在passcode1进行scanf后调用了fflush函数和printf函数,任意覆盖其中一个即可,再通过readelf -r命令查看got表的情况,发现fflush函数的got为0x804a004,于是第一次要求输入name时我们将passcode1的值改为fflush的got地址,然后第二次要求输入passcode1时我们输入system函数调用处的地址0x80485e3,这样在执行fflush函数时就会跳转到system函数执行cat flag命令,于是得到flag。整体输入为:

random

 rand()函数生成的是伪随机数,在不改变种子的情况下生成的随机数序列总是相同的,在本题中没有设置种子,rand的返回值是固定的,直接输入这个值的异或结果即可

shiyanbar

证明自己吧

32位PE可执行程序,用IDA将程序打开,发现以内存中的数据给堆栈中的一部分连续内存赋值,然后将它作为字符串跟我们的输入作比较,中间对两边的数据都进行了处理,直接反向运行即可

10000000

32位可执行程序,用IDA将程序打开,发现该程序给一部分内存空间赋值,然后将输入字符串的每一个字符的数值或上0x80,由于键盘输入不会大于0x80,所以或0x80实质就是加上0x80,直接减去0x80即可获得flag

原文地址:https://www.cnblogs.com/amlkhlwd33/p/9393572.html