arm ida 偽代碼 安卓 符號表_IDA 制作 sig文件 gdb 導入符號表

背景

最近比賽遇到了一個題目, 32位靜態鏈接去符號了. 所以用IDA分析的時候很多libc的庫函數都無法識別, 就需要在 IDA 中引入 sig 文件. 從而可以識別諸如 read, write, malloc, free 這些庫函數. 雖然網上已經有很多制作好的sig文件, 但是還是應該學會自己制作sig文件以備不時之需.

有了 sig 文件后靜態分析是沒問題了, 但是動態調試的時候因為沒有符號還是很麻煩, 比如這題我就需要查看 _IO_FILE_plus 這個結構體的內容就會很麻煩

pwndbg> p *(struct _IO_FILE_plus *) 0xf7ffdbe9

No struct type named _IO_FILE_plus.

所以我們還需要在gdb中導入libc中的符號表.

下面就是具體解決方案

一. 制作 sig 文件

需要使用 idasdk, 下載鏈接在本文底部.

我是在windows下制作的, 建議下載解壓后添加到系統路徑中:idasdk70\flair70\bin\win

1.獲取libc.a

我的系統是 ubuntu 16.04 server. 這個系統上 32位 libc.a 的位置是 /usr/libx32/libc.a, 64位的我沒找到

制作pat文件

需要用到上面找到的libc.a 以及 idasdk70\flair70\bin\win\ 下的 pelf.exe:

pelf.exe .\libc.a .\libc.pat

根生成 sig文件

需要用到上一步生成的 pat文件以及 idasdk70\flair70\bin\win\下的 sigmake.exe

sigmake.exe .\libc.pat .\libc.sig

這一步可能會報錯

.\libc.sig: modules/leaves: 1306/1575, COLLISIONS: 14

See the documentation to learn how to resolve collisions.

猜測是因為有些函數會對應好幾個符號, 為了保證函數和符號一一對應, 就需要人為干預一下.

解決方法就是修改當前目錄下的 libc.exec 文件, 具體操作文件里有提示.

修改之后再執行一遍

sigmake.exe .\libc.pat .\libc.sig

即可得到 libc.sig 文件.

導入IDA

首先將上一步得到的 sig 文件復制到 IDA安裝目錄的sig/pc下.

然后打開IDA , shift+F5,右鍵添加新的簽名文件, 選擇 libc.sig即可

二. gdb 導入符號表

方法很簡單

gdb -e ./pwn -s ./libc.so

pwn 是去符號靜態鏈接的文件.

libc.so 是本地帶符號的動態鏈接庫.

libc.so和pwn所使用的libc的架構得一致.

如果想在pwntools里面使用的話可以這樣

io = process("./pwn")

gdb.attach(io, "add-symbol-file ./libc.so 0")

實例(湊字數):

? test gcc ./test.c -s --static -o pwn

? test gdb ./pwn

pwndbg> r

Starting program: /mnt/hgfs/ctf/ctf_games/test/pwn

^C

Program received signal SIGINT, Interrupt.

pwndbg> p *(struct _IO_FILE_plus *) $rsp

No struct type named _IO_FILE_plus.

pwndbg> add-symbol-file ./libc_2.23.so 0

Reading symbols from ./libc_2.23.so...done.

pwndbg> p *(struct _IO_FILE_plus *) $rsp

$1 = {

file = {

_flags = 4196856,

_IO_read_ptr = 0x10e1000004d2 ,

_IO_read_end = 0x524c03e851558b00 ,

_IO_read_base = 0x6ca018 "ЮC",

_IO_write_base = 0x400c66 "\211\307\350", ,

_IO_write_ptr = 0x0,

_IO_write_end = 0x100000000 ,

_IO_buf_base = 0x7fffffffe3a8 "#\346\377\377\377\177",

_IO_buf_end = 0x4009ae "UH\211\345H\203\354\020dH\213\004%(",

_IO_save_base = 0x4002c8 "H\203\354\bH\213\005\035\235,",

_IO_backup_base = 0xba1f4e1aa56a16b1 ,

_IO_save_end = 0x4016d0 "AVA\276?l",

_markers = 0x401760,

_chain = 0x0,

_fileno = 0,

_flags2 = 0,

_old_offset = 5035219255199143601,

_cur_column = 5809,

_vtable_offset = 24 '\030',

_shortbuf = ,

_lock = 0x0,

_offset = 0,

_codecvt = 0x0,

_wide_data = 0x0,

_freeres_list = 0x0,

_freeres_buf = 0x0,

__pad5 = 4196782,

_mode = 1,

_unused2 = "\000\000\000\000\250\343\377\377\377\177\000\000\320\026@\000\000\000\000"

},

vtable = 0x0

}

pwndbg>

注意:

需要使用帶符號的libc, 然而ubuntu自帶libc.so的是去符號的. 需要自行下載帶符號libc或者自己編譯, 編譯方式可以參考我之前一篇博客

Appendix

下載idasdk:

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

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

相關文章

lua如何打印行號_LUA教程錯誤信息和回跟蹤(Tracebacks)-34

雖然你可以使用任何類型的值作為錯誤信息,通常情況下,我們使用字符串來描述遇到的錯誤。如果遇到內部錯誤(比如對一個非table的值使用索引下標訪問)Lua將自己產生錯誤信息,否則Lua使用傳遞給error函數的參數作為錯誤信息。不管在什么情況下&a…

python 套接字 struck_Python socket粘包問題(最終解決辦法)

套接字:就是將傳輸層以下的協議封裝成子接口對于應用程序來說只需調用套接字的接口,寫出的程序自然是遵循tcp或udp協議的實現第一個功能個:實現:通過客戶端向服務端發送命令,調取windows下面的cmd窗口,將服…

python的lib文件夾_python遍歷文件夾os.path與pathlib

首先我們來一個需求,這個函數接受文件夾的名稱作為輸入參數,返回該文件夾中文件的路徑,以及其包含文件夾中文件的路徑。def print_dir_contents(sPath):import osfor sChild in os.listdir(sPath):sChildPath os.path.join(sPath,sChild)if …

python 數據字典用法_python數據字典的操作

一、什么是字典?字典是Python語言中唯一的映射類型。映射類型對象里哈希值(鍵,key)和指向的對象(值,value)是一對多的的關系,通常被認為是可變的哈希表。字典對象是可變的,它是一個容器類型,能存儲任意個數…

雙系統安裝deepin20_win10deepin15.10雙系統安裝教程

第二步:下載深度啟動盤制作工具深度啟動盤制作工具地址第三步:制作U盤啟動盤打開第二部下載的啟動盤制作工具,并準備一個u盤插入待裝系統的電腦,選擇鏡像文件后,下一步選擇磁盤并勾選格式化磁盤,點下一步開…

ubuntu19 安裝git_在Ubuntu 18.04上安裝Git

步驟1.首先,通過運行以下命令確保您的系統和apt包列表完全更新:apt-get update -yapt-get upgrade -y第2步。在Ubuntu 18.04上安裝Git。現在讓我們安裝git:apt install git您可以使用以下命令來檢查已安裝的git版本:$ git --versi…

mysql更新多條數據6_mysql語句:批量更新多條記錄的不同值

mysql更新語句很簡單,更新一條數據的某個字段,一般這樣寫:如果更新同一字段為同一個值,mysql也很簡單,修改下where即可:這里注意 ‘other_values’ 是一個逗號(,)分隔的字符串,如&am…

php mysql query 行數_如何在PHP中獲取MYSQL數據庫返回的數據的行數?

展開全部1. mysql_num_rows 可得到e69da5e887aa3231313335323631343130323136353331333337383861查詢記錄數<?php $con mysql_connect("localhost", "hello", "321");if (!$con){die(Could not connect: . mysql_error());}$db_selected …

mysql數據庫開發環境_MacOS下搭載開發環境之數據庫篇(Mysql + Navicat)

一、安裝Mysql1、官網下載mysql的tar包(提示&#xff1a;建議vpn環境下載)2、解壓并安裝tar包# 移動解壓后的二進制包到安裝目錄sudo mv mysql-5.7.19-osx10.9-x86_64 /usr/local/mysql# 更改 mysql 安裝目錄所屬用戶與用戶組cd /usr/localsudo chown -R root:wheel mysql# 初始…

mysql alter 唯一鍵_MySQL列屬性 之 唯一鍵

MySQL列屬性 之 唯一鍵唯一鍵唯一鍵&#xff1a;每張表往往有多個字段需要具有唯一性&#xff0c;數據不能重復&#xff0c;但是在每張表中&#xff0c;只能有一個主鍵&#xff0c;因此 唯一鍵就是用來解決表中多個字段需要具有唯一性的問題。例如身份證號碼應該每一行的記錄不…

如何在mysql中添加復選框_如何使用輸入和復選框更新mysql

如果我理解正確,您需要這樣做:mysql_query("UPDATE mp3SETaktif 1,baslik " . mysql_escape_string($_POST[baslik]) ."WHERE id $zuha");mysql_query("update mp3 set aktif 1,baslik $_POST[baslik]where id $_POST[id]")現在唯一的區別…

mysql 檢查列是否存在,如何檢查mysql表列是否存在?

How can I check if mysql table field even exists ?The column name is price and I need to see if it exists.Havent understood really how the EXISTS works...Any examples or ideas ?Thanks解決方案In PHP:$fields mysql_list_fields(database_name, table_name);$c…

mysql proxy yum_mysql 高可用架構 proxysql 之一 yum安裝

os:centos 7.4mysql: 5.7proxysql: 1.4.10ip 規劃如下&#xff1a;192.168.56.101 node1 (proxysql)192.168.56.102 node2 (mysql master)192.168.56.103 node3 (mysql slave)192.168.56.104 node4 (mysql slave)安裝mysql 5.7node2、node3、node4 安裝 mysql 5.7 software詳細…

wpf 使用位圖畫圖為什么斷斷續續_WPF的未來是微軟WinUi!

WPF(Windows Presentation Foundation)是微軟推出的基于Windows 的用戶界面框架&#xff0c;屬于.NET Framework 3.0的一部分。它提供了統一的編程模型、語言和框架&#xff0c;真正做到了分離界面設計人員與開發人員的工作&#xff1b;同時它提供了全新的多媒體交互用戶圖形界…

antd新增一行頁碼不正確_antd-Table@4.x對rowKey屬性的重構

時間&#xff1a;2020/04/26 &#xff0c;轉載請注明出處。寫在前面antd團隊于2020年2月發布了醞釀已久的antd4.0版本&#xff0c;對樣式的調整、部分組件邏輯的重構都進行了較大改動&#xff0c;本文針對Table的rowKey屬性重構作分析。由一個mistake帶來的思考在數據治理模塊的…

qt調用mysql調用了存儲過_Qt調用Server SQL中的存儲過程

Server SQL中的存儲過程如下&#xff1a;CREATE procedure PINSERTPCpcnum int,pcname varchar(50),pctype int,ipaddress varchar(50),port int,pcid int outputas--declare pcid intif exists (select * from COMPUTERTABLE where PcNum pcnum)set pcid -1elsebegininser…

pandas mysql index_Pandas從入門到精通(3)- Pandas多級索引MultiIndex

首先了解一下什么是多級索引&#xff0c;以及它的作用&#xff0c;為什么要有這個玩意。多級索引也稱為層次化索引(hierarchical indexing)&#xff0c;是指數據在一個軸上(行或者列)擁有多個(兩個以上)索引級別。之所以引入多級索引&#xff0c;在于它可以使用戶能以低維度形式…

tensorflow 啟動多個session_Tensorflow源碼解析7 -- TensorFlow分布式運行時

1 概述TensorFlow架構設計精巧&#xff0c;在后端運行時這一層&#xff0c;除了提供本地運行時外&#xff0c;還提供了分布式運行時。通過分布式訓練&#xff0c;在多臺機器上并行執行&#xff0c;大大提高了訓練速度。前端用戶通過session.run()啟動系統執行時&#xff0c;tar…

shell swt 樣式_SWT之路:SWT圖像顯示

簡明現代魔法 -> Java編程語言 -> SWT之路&#xff1a;SWT圖像顯示SWT之路&#xff1a;SWT圖像顯示2009-10-03程序演示還是先用SWT Desiner創建界面程序。然后創建一個Display對象和Image對象&#xff0c;和一個GC對象。類org.eclipse.swt.graphics.GC是一個封裝了所有可…

swool tcp mysql_swoole/mysql(異步)

# 異步Swoole\Mysql**(要求Workerman版本>3.3.6)**## 注意:此組件由swoole底層提供&#xff0c;由C語言編寫&#xff0c;具有超高性能。## 安裝&#xff1a;安裝有swoole擴展即可## 示例&#xff1a;phprequire_once ../Autoloader.php;use Workerman\Worker;use \Swoole\My…