开新坑,随手做一做。
welcome
二话不说,掏出IDA
很明显,需要把*address地址改成0,则可以获取flag。
这时候,看伪代码其实不好看,得看汇编
看到这一行,rdx是可控的,也就是我们输入的size,在伪代码中可以看到。我们要做的只要把rbp设置为0.
rbp也就是v5,由malloc赋值,怎么设置为0?malloc返回为NULL(0)就行。
开头程序会print address的地址的值,那么长的地址输入进去,malloc应该会返回NULL吧。
试了下果不其然。
所以我们用计算机,构造开头address地址+1,malloc返回NULL,size值-1则是address地址。
成功拿到flag
sub
送分题,不多说,看题目。
看到这个第一反应原本是溢出,但是看到<=,emmmm,直接4918 -1,解决。
减去负数就是加desu。
add
看题。
很明显,addr可以数组越界溢出栈。直接覆盖ret的esp返回值就行。
内置了一个函数,要求就是覆盖rip到这里。
因为地址 是静态,所以直接看ida的地址,400822,然而这个是16进制,16转10就是4196386.
之后,我们查找rip地址,本来可以直接用ida pro远程调试的,但是我这边ida pro+wsl出各种问题没调试成功。
没办法只好gdb了。 设置printf断点,在第二个断点用x/30x $sp
打印esp信息
本来以为是红框处那里,但是试了一下,结果发现是下面那个白框处。不知道为什么,疑惑。要是有ida就好了。
最后试了下,试出来第三个参数是13,也就是越界的下标。
之后我们运行,在input:
后输入 0 4196386 13
(前面两个无所谓,只要相加之和等于4196386即可
运行后会回到input:
状态,这时候我们按下ctrl+D发送EOF,即可得到flag
未完待续,咕咕咕ing