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
{
"Nah..\n"
main(
argc, char
*
argv[]){
func(
0xdeadbeef
return
0
;
我们的目标是执行 system("/bin/sh");需令 key == 0xcafebabe,key 的初始值为 0xdeadbeef已知 overflowme 是一个局部数组变量,长度为 32,且通过 gets 获取,没有边界检查,所以可以考虑在执行 gets(overflowme); 把 key 的值覆盖为 0xcafebabe
与源码对照着看a1 即 key,地址在 ebp + 8h 处s 即 overflowme[32]; 首地址在 ebp - 2C 处所以 s 填充 2Ch + 8h = 34h = 52 个字符后,可以覆盖 key 值
注 cat - 是为了与 shell 保持连接
[看雪官方培训] Unicorn Trace还原Ollvm算法!《安卓高级研修班》2021年6月班开始招生!!
tfire 这题的canary居然只是个摆设。。。我还想了半天。。。
i乂 源码里没有验证 canary 的语句。。。