2015-02-09 36 views
0

我想測試程序,人們不應該能夠把任何字符作爲第一個參數,它是做這樣:C編程給 0作爲參數

for (i=0; argv[1][i]!=0; i++) { 
     if (argv[1][i] > 'z' || argv[1][i] < 'a') { 
      printf("Not allowed char in filename\n"); 
      exit(1); 
     } 
    } 

我在想,如果它在開始時可能會僞造一個\ 0來引入字符,只是因爲在此之後程序會複製整個緩衝區(在整個鏈中使用strncpy),因此它會複製\ 0 char之後的內容。 我的問題是與bash,我怎麼能寫第一個論據來僞造這個\ 0,然後把一個有效的字符不會被檢測到。

編輯:所以我的目標是做一個簡單的緩衝區溢出,像這樣一個的shellcode:

\x6a\x31\x58\x99\xcd\x80\x89\xc3\x89\xc1\x6a\x46\x58\xcd\x80\xb0\x0b\x52\x68\x6e\x2f\x73\x68\x68\x2f\x2f\x62\x69\x89\xe3\x89\xd1\xcd\x80 

感謝我設法包括\ 0處的字符鏈起點的答案與$printf("\0 abc) 但仍如果我用我的代碼替換abc,它會檢測其中的實際字符。不知道發生了什麼,但我正在嘗試沒有該程序的printf。

編輯2:其實printf返回一個shellcode的錯誤,這就是程序檢測到字符的原因。我試圖解決這個錯誤,因爲$,bash似乎試圖解釋shellcode本身。

回答

1

你可以使用bash的printf命令

例如

yourcommand $(printf "\0abc") 
+0

感謝它的作品,但我仍然有\\ 0後的字符問題。 bash試圖在將它傳遞給程序之前解釋生成的字符鏈,因此bash向程序返回一個錯誤......任何想法? – user3779430 2015-02-09 10:29:13

+0

我沒有意識到這個問題,但它是完全可以理解的,我在這裏找到了正確的解釋:http://stackoverflow.com/questions/2283335/how-to-pass-in-a-null-character-in- a-command-line-argument-in-c – cadrian 2015-02-10 07:03:00

+1

謝謝你的完美 – user3779430 2015-02-11 14:45:38

0

使用$'<letters>\<escape><letters>'語法(在bash中支持)。

I.e.

[email protected]:~$ echo aaa $'bb\0bad' ccc 
aaa bb ccc