[Pwnable.kr] echo1

02. 3 月 2016 pwnable writeup 0

下载下来IDA反编译,发现里面只有echo1是实现了的,另外两个echo没有实现,不去管它

可以看出这段代码中有两个溢出点,一个是在main函数里scanf的地方,读了一个24位的字符串,覆盖到了一个整形的地址上,覆盖的变量似乎没什么用,也覆盖不到ori_rbp。另外一个溢出点在echo1中,gets了一个128位的字符串,写到了rbp-0x20这个位置,这里是可以覆盖到ret的。

用alsr命令看一下程序没有开ALSR,那一般思路就是覆盖掉echo的ret指针,跳到我们设计的shellcode上就ok了,shellcode可以从shell-storm.org上找一个,最短的http://shell-storm.org/shellcode/files/shellcode-806.php需要27字节,然后突然蛋疼了,因为这27个字节没办法完整写到main函数的栈里面(它只读24个),所以这里的溢出看起来不太好用。

所以我们只能把shellcode安排在echo里面的栈上了,但是ret指针又很难设计,因为在payload中ret后面紧跟着的就是shellcode,这个ret该写成多少……

回头读代码,发现我们在main中scanf的东西(前8字节)又被赋值到了全局变量id中,这个id地址是固定的,从ida中可以找到cs:id是0x6020a0,id的内容又是我们可以控制的,所以我们可以把ret地址设计成id的地址,在echo1执行完之后(leave; ret)rip被定向到0x6020a0,此时rsp指向了我们的shellcode的启示部分,我们只需要在id中写jmp rsp的指令码就ok了。

WG@$4LS2`L4Y_N3~}WOR7ZY

然后就得到了shell

 

======update========

后来在网上发现了23字节得shellcode,打算在main函数那里溢出一下试试,但是发现gdb看到的栈地址跟实际运行时候的栈地址不一样的,据说因为环境变量引起(http://stackoverflow.com/questions/17775186/buffer-overflow-works-in-gdb-but-not-without-it/17775966#17775966)这里太麻烦了就没有尝试,不过感觉应该也可行


发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

This site uses Akismet to reduce spam. Learn how your comment data is processed.