1:题目:[深育杯 2021]find_flag (64)
checksec
ida分析:
利用格式化字符串泄露canary和一个任意一个栈地址。
看偏移量,第一个printf下断点。b *$rebase(0x1356)
任意的一个栈地址在gdb中后三位为46f,在ida中找:
泄露的栈地址减去偏移量0x146f即为基地址。
利用格式化字符串漏洞泄露canary与任意一个栈地址。
程序有cat flag.txt
得到基地址即可求出别的函数的真实地址。
构造payload拿shell。
exp:
2:题目:[2021 鹤城杯]easyecho (stack smash)
checksec
ida分析:
由于v8与v9地址在栈上相连,因此可以先泄露栈地址,来计算基地址。
v9调用的函数是:
因此,解题思路是,由于程序保护全开,要先算基地址,由基地址加偏移量即可算出其他任意函数地址。然后先输入backdoor,调用v9,将flag读到偏移量为0x202040的BSS段地址上。然后把文件名的地址改为这个地址,然后再退出程序,stack smash即可打印出flag
先泄露地址计算基地址及其他函数地址:
刚才泄露的就是与v8相连的v9的地址,减去其全局偏移即为基地址
gdb看保存文件名的地址与gets的偏移
保存文件名的数组是 __libc_argv[0],计算其距离gets输入点的偏移为0x198,(但0x198打不通,0x168才打通,不知道为什么偏移相差0x30,似乎是本地和远端偏移不一样)。
接下来把填充垃圾数据到这个地址处覆盖这个地址为flag的地址,这样退出程序,程序报错但打印出了flag。正常是程序报错打印文件名,但我们把文件名的地址覆盖成了flag被读入的地址。典型的stack samsh。
注意点
要输入exit才开始退栈,退栈才开始检查canary。
exp: