2013-12-21 73 views
12

對於軟件安全中的類,我必須簡單地返回libc攻擊。我設法制作了一個perl腳本,在給出正確的指向system(),exit()和/ bin/sh字符串的指針後完成攻擊。我發現這些指針使用gdb「p系統」等。現在我想通過編寫一個c程序,使其在運行時找到system()和exit()的地址,從而使漏洞更加「動態」。我該怎麼做呢?我試過「&系統」,但這似乎並沒有給我正確的地址。編號: 系統沒有啓用ASLR。返回libc查找指針

回答

6

你可以很容易發現利用binutils地址 - objdumpreadelf,但只有二進制實際使用符號的地址。未使用的符號未與libc庫鏈接。

說你想破解的ls命令:

objdump -d `which ls` | less 

你會發現這節:

0000000000402910 <[email protected]>: 
    402910:  ff 25 da 89 21 00  jmpq *0x2189da(%rip)  # 61b2f0 <_fini+0x208704> 
    402916:  68 5e 00 00 00   pushq $0x5e 
    40291b:  e9 00 fa ff ff   jmpq 402320 <_init+0x10> 

所以,現在你有地址:0x402910exit()功能的跳轉地址(如果您嘗試使用printf("%x\n", exit);即可獲得印刷品

關於systemls未使用此符號,因此您無法以此方式訪問它,因爲它未鏈接。

+0

如果它不是庫入口點,那麼它必須在某處定義。 C標準要求它被定義爲一個函數,所以它必須存在某個地方。嘗試找到它。 – randomusername

+0

@randomusername我更新了我的答案 - 現在我確切知道如何找到函數的地址。但是,**您要調用的符號/函數必須已被您要破解的二進制文件使用。**否則,它不會被鏈接。 – TMS

+0

@randomusername一個進程也將結束,如果main返回...沒有特殊的功能...你剛用完程序。如果一個符號沒有被使用,它不需要在任何地方的目標文件中。如果它沒有被編譯,你將不得不在運行時動態鏈接......這是有限的實用工具,因爲該程序沒有使用它,並且你已經在那個時候執行了任意代碼。 –

0

我認爲&system將在編譯時解析。你有沒有試過dlopen()dlsym()?只是建議,我不知道他們是否會工作。

編輯他們的

沒有將目標進程上下文之外的工作,如果某種Address space layout randomization到位。

2

默認情況下,在某些流行的Linux發行版中啓用ASCII Armoring。它通常將重要庫的地址映射到包含NULL字節的內存範圍。你可以閱讀更多關於如何繞過ASCII鎧裝here.

+0

一篇有趣的文章。感謝分享。 +1 –

2

如果我沒有弄錯,你試圖用C編寫一個程序來執行和利用易受攻擊的用戶空間程序?在這種情況下,如果你使用execve()編寫的程序使用execve(),那麼這將啓動具有它自己的進程空間的易受攻擊的進程。這將包括重新加載的libc。想想看這樣的:

pwner 
`-[libc] 
`-./vuln 
    `-[libc] 

在這種情況下,您的動態程序,「pwner」將需要使用類似的ptrace()系統調用跟蹤漏洞程序,並獲得libc的指針。這是GDB在調試二進制文件時的有效工具。您的程序應該使用ELF規範來查找E_ENTRY的地址。從這裏使用ptrace()。首先使用PTRACE_TRACEME,然後使用PTRACE_PEEKTEXT。