pwnable.kr之bof(5)

根据连接下载两个文件bof 和 bof.c

其中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;
}

bof为32为程序,使用idapro_32载入,查看func伪代码

分析伪代码,有

  • 输入值gets(&s),其中char s位置为[bp-2Ch]   //line 3
  • func(int a1)比较的定值a1 位置为[bp+8h]  //line1 line 9
  • 需要控制输入值s使其覆盖为a1定值0xCAFEBABE
  • 需要覆盖的位置距离为:2C+8 = 34H

所以构造payload:

S = ‘a’*0x34+’0xCAFEBABE’

发现栈攻击迹象,程序终止。原因可能是目标机器开启了栈保护机制canary,函数试图返回时会修改canary值,程序终止。观察源码我们不需要程序执行到返回,相反需要维持System(‘bin/sh’),拼接一个等待命令cat

您可能还喜欢...