我有一個特定的問題,我有一個二進制檔案,它使用 execv 啟動一個 shell,但是 shell 更改了用戶,而使用 gdb 我似乎無法找到用戶更改發生的位置。
level0@RainFall:~$ whoami
level0
level0@RainFall:~$ ls -la
-rwsr-x--- 1 level1 users 747441 Mar 6 2016 level0
level0@RainFall:~$ gdb
(gdb) file level0
Reading symbols from /home/user/level0/level0...(no debugging symbols found)...done.
(gdb) run 423
Starting program: /home/user/level0/level0 423
process 3718 is executing new program: /bin/dash
$ whoami
level0
但是當我不使用 gdb 時:
level0@RainFall:~$ ./level0 423
$ whoami
level1
$
這是主要的disas
0x08048ec0 < 0>: push ebp
0x08048ec1 < 1>: mov ebp,esp
0x08048ec3 < 3>: and esp,0xfffffff0
0x08048ec6 < 6>: sub esp,0x20
0x08048ec9 < 9>: mov eax,DWORD PTR [ebp 0xc]
0x08048ecc < 12>: add eax,0x4
0x08048ecf < 15>: mov eax,DWORD PTR [eax]
0x08048ed1 < 17>: mov DWORD PTR [esp],eax
0x08048ed4 < 20>: call 0x8049710 <atoi>
0x08048ed9 < 25>: cmp eax,0x1a7
// it compare argv[1] with 423 if it is unequal it print No!
0x08048ede < 30>: jne 0x8048f58 <main 152>
0x08048ee0 < 32>: mov DWORD PTR [esp],0x80c5348
0x08048ee7 < 39>: call 0x8050bf0 <strdup>
0x08048eec < 44>: mov DWORD PTR [esp 0x10],eax
0x08048ef0 < 48>: mov DWORD PTR [esp 0x14],0x0
0x08048ef8 < 56>: call 0x8054680 <getegid>
0x08048efd < 61>: mov DWORD PTR [esp 0x1c],eax
0x08048f01 < 65>: call 0x8054670 <geteuid>
0x08048f06 < 70>: mov DWORD PTR [esp 0x18],eax
0x08048f0a < 74>: mov eax,DWORD PTR [esp 0x1c]
0x08048f0e < 78>: mov DWORD PTR [esp 0x8],eax
0x08048f12 < 82>: mov eax,DWORD PTR [esp 0x1c]
0x08048f16 < 86>: mov DWORD PTR [esp 0x4],eax
0x08048f1a < 90>: mov eax,DWORD PTR [esp 0x1c]
0x08048f1e < 94>: mov DWORD PTR [esp],eax
0x08048f21 < 97>: call 0x8054700 <setresgid>
0x08048f26 < 102>: mov eax,DWORD PTR [esp 0x18]
0x08048f2a < 106>: mov DWORD PTR [esp 0x8],eax
0x08048f2e < 110>: mov eax,DWORD PTR [esp 0x18]
0x08048f32 < 114>: mov DWORD PTR [esp 0x4],eax
0x08048f36 < 118>: mov eax,DWORD PTR [esp 0x18]
0x08048f3a < 122>: mov DWORD PTR [esp],eax
0x08048f3d < 125>: call 0x8054690 <setresuid>
0x08048f42 < 130>: lea eax,[esp 0x10]
0x08048f46 < 134>: mov DWORD PTR [esp 0x4],eax
0x08048f4a < 138>: mov DWORD PTR [esp],0x80c5348
//at this point euid and egid are the one of the user that launched gdb`
0x08048f51 < 145>: call 0x8054640 <execv>
// we never go there since execv opens a shell
0x08048f56 < 150>: jmp 0x8048f80 <main 192>
0x08048f58 < 152>: mov eax,ds:0x80ee170
0x08048f5d < 157>: mov edx,eax
0x08048f5f < 159>: mov eax,0x80c5350
0x08048f64 < 164>: mov DWORD PTR [esp 0xc],edx
0x08048f68 < 168>: mov DWORD PTR [esp 0x8],0x5
0x08048f70 < 176>: mov DWORD PTR [esp 0x4],0x1
0x08048f78 < 184>: mov DWORD PTR [esp],eax
0x08048f7b < 187>: call 0x804a230 <fwrite>
0x08048f80 < 192>: mov eax,0x0
0x08048f85 < 197>: leave
0x08048f86 < 198>: ret
End of assembler dump.
如果我通過 gdb 或在 shell 中執行它,我不明白二進制檔案如何改變行為,也許是因為二進制檔案的專有是 level1?
如果有人有時間向我解釋它是如何作業的,我會非常高興
非常感謝
uj5u.com熱心網友回復:
我不明白二進制如何改變行為
二進制不-當給出了一組的uid二進制檔案(這就是內核創建不同的UID一個新的行程s中-rwsr-x--- 手段)。
出于明顯的安全原因,內核在除錯二進制檔案時不會這樣做。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/356295.html
