pwnable小合集

请注意,本文编写于 1922 天前,最后修改于 1642 天前,其中某些信息可能已经过时。

开新坑,随手做一做。

welcome

二话不说,掏出IDA

TIM截图20190821011747.jpg
TIM截图20190821011747.jpg

很明显,需要把*address地址改成0,则可以获取flag。

这时候,看伪代码其实不好看,得看汇编

TIM截图20190821011747.jpg
TIM截图20190821011747.jpg

看到这一行,rdx是可控的,也就是我们输入的size,在伪代码中可以看到。我们要做的只要把rbp设置为0.

rbp也就是v5,由malloc赋值,怎么设置为0?malloc返回为NULL(0)就行。

开头程序会print address的地址的值,那么长的地址输入进去,malloc应该会返回NULL吧。

试了下果不其然。

所以我们用计算机,构造开头address地址+1,malloc返回NULL,size值-1则是address地址。

成功拿到flag

sub

送分题,不多说,看题目。

TIM截图20190821013430.jpg
TIM截图20190821013430.jpg

看到这个第一反应原本是溢出,但是看到<=,emmmm,直接4918 -1,解决。

减去负数就是加desu。

add

看题。

TIM截图20190821163808.jpg
TIM截图20190821163808.jpg

很明显,addr可以数组越界溢出栈。直接覆盖ret的esp返回值就行。

TIM截图20190821163808.jpg
TIM截图20190821163808.jpg

内置了一个函数,要求就是覆盖rip到这里。

因为地址 是静态,所以直接看ida的地址,400822,然而这个是16进制,16转10就是4196386.

之后,我们查找rip地址,本来可以直接用ida pro远程调试的,但是我这边ida pro+wsl出各种问题没调试成功。

没办法只好gdb了。 设置printf断点,在第二个断点用x/30x $sp打印esp信息

TIM截图20190821163808.jpg
TIM截图20190821163808.jpg

本来以为是红框处那里,但是试了一下,结果发现是下面那个白框处。不知道为什么,疑惑。要是有ida就好了。

最后试了下,试出来第三个参数是13,也就是越界的下标。

之后我们运行,在input:后输入 0 4196386 13 (前面两个无所谓,只要相加之和等于4196386即可

运行后会回到input:状态,这时候我们按下ctrl+D发送EOF,即可得到flag

未完待续,咕咕咕ing

添加新评论

评论列表