保护措施全开

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: