level11

해커스쿨 FTZ 2018. 3. 27. 19:49

문제가 어려워지기 시작한다고 정평이난 LEVEL11번이다.

 

level11의 힌트에서는 한 코드를 보여준다.

맥락상 attackme파일의 코드인 듯 하다.

 

우선 코드상

setreuid()

strcpy()

printf()

가 보인다.

 

setreuid는 setuid를 설정하는 것으로 3092는 level12의 uid이다.

strcpy는 argv[1](입력받은 파라미터) 를 앞서선언한 str[256]에 그대로 복사하는 함수인데, 이 함수는 크기를 확인하지 않고 붙혀넣는다는 취약점이 있다.

이것을 이용해 버퍼오버플로우를 일으킬 수 있을 것이다.

 

 

이 중

 

main의 디스어셈블을 보면 setreuid나 strcpy, printf 등 hint에서 보인 함수들의 이름이 보인다.

 

내용을 보면 sub 0x108이 보이는데 코드의 처음에서 char str[256]을 선언한것을 보아 이 공간이 str이 할당된 것으로 보였다. 0x108은 16진수로 264이다. 따라서 256바이트에 8바이트의 더미가 생긴것을 확인했다.

 

뒤의 push 0xc14는 setreuid에 넘겨주는 패러미터다  0xc14는 십진수로 3092로 코드내의 setreuid( 3092, 3092 );와 일치한다.

 

그런데 이 gdb 상태에서는 run을 하면 실행이 실패한다.

 

검색을 해보니 권한이 없어서 안된다고 해서 하위 tmp폴더에 hint파일을 복사해서 gcc로 컴파일 하였다.

 

이렇게 해보니 실행이 됨을 알 수 있었다.

 

이 프로그램은 str[256]이 더미까지 총 264바이트를 할당받으므로 ret주소는 264바이트 + 4바이트 후에 있을 것이다.

사실 시작값을 확실히 구하기는 어려우므로 버퍼를 0x90(NOP)로 가득채운다.

NOP를 만나면 아무 연산을 하지 않고 다음 코드가 들어올때까지 프로그램이 진행되므로 그 중간에 쉘코드를 넣어두고 ret을 그 이전 주소로 설정하면 NOP를 지나서 쉘코드가 진행될 것이다.

 

NOP가 시작되는 곳을 알아보기위해 strcpy앞에 breakpoint를 설정하고

r `python -c 'print "\x90"*243+"a"*25+"\x90\x90\x90\x90"'`를 실행했다.


프로그램을 실행한 후 'nexti'로 진행해 esp를 확인해 보았다.

 

 

코드가 실행된 후 패러미터로 넘겨준대로 0x90 243개와 'A' 25개 후 0x90이 나오는걸 볼 수 있다. 그렇다면 0x90이 시작하는 0xbfffe050을 ret으로 설정하면 될거라 생각했다.

(인터넷에서 구한 쉘코드가 25바이트이기 때문에 25바이트를 A로 대체하였다.)

 

구한 쉘코드는

\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이다.

 

 

./attackme `python -c 'print "\x90"*243+"\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"+"\x50\xe0\xff\xbf"'`
를 실행했는데 Segmentation fault 가 떴다.

 



다시 gdb를 실행해서 esp를 2000까지 보았는데







0x90 이 반복되는 것을 발견했다.


쉘코드 25바이트를 넣고 0xbffffb30을 ret으로 오버플로우 하면 될 것 같았다. 




실행했더니 성공한 것을 확인했다.

'해커스쿨 FTZ' 카테고리의 다른 글

level13  (0) 2018.03.28
level12  (0) 2018.03.28
level10  (0) 2018.03.26
level9  (2) 2018.03.26
level8  (0) 2018.03.26
블로그 이미지

천재보다는 범재

,

level10

해커스쿨 FTZ 2018. 3. 26. 17:54

 

 

두명의 사용자가 대화방을 이용하여 비밀스런 대화를 나누고 있다. 그 대화방은 공유 메모리를 이용하여 만들어졌으며, key_t의 값은 7530이다. 이를 이용해 두 사람의 대화를 도청하여 level11의 권한을 얻어라.

 

공유메모리 사용 내역을 알아보기 위해 ipcs -a를 사용했다.

 

key가 0x00001d6a를 10진수로 바꾸면 7530이다. 힌트에서 언급한 숫자와 같다.

 

이 코드부분은 (http://molrayo.tistory.com/entry/Network-shmgetshmatshmdtshmctl-%EA%B4%80%EB%A0%A8-%EC%98%88%EC%A0%9C)를 참고했다.

 

공유메모리에 대한 지식이 많이 없는 상태에서 코드들을 뒤져보며 이해한 건,

 

1. shmget()

int shmget(key_t key, int size, int shmflg);

shmget을 통해 공유메모리에 접근하는데 여기서 key_t값을 전에 확인한 7530으로 설정하였다. shmget함수는 공유메모리의 ID값을 리턴하기때문에 이를 shmid에 저장한다.

 

 

2. shmat()

void *shmat(int shmid, const void* shmaddr, int shmglf)

shmat는 공유메모리를 프로세스에 첨부한다. 붙이는 영역은 shmaddr로 결정할 수 있는데 NULL인경우 시스템이 알아서 적당히 붙인다고 한다.

그리고 shmat()함수는 해당 공유 메모리 id값에 대한 어드레스를 리턴해준다.

 

 

3. shmctl()

int shmctl(int shmid, int cmd, struct shmid_ds *buf);

shmctrl()은 공유메모리를 제어한다. 즉 공유메모리의 내용을 받아오거나 수정, 삭제 하기 위해 사용한다.

 

이 코드의 경우 공유메모리의 내용을 받아와야하기 때문에 가장먼저 shmget()을 통해 접근하고, shmat()를 통해 프로세스에 첨부한 뒤, shmctl()에서 IPC_STAT을 사용해서 메모리의 내용을 받아왔다.

 

일단 대개 이해는 가지만 나중에 코드를 직접 짜면서 여러번 복습해야하는 부분인 것같다.

 

이 프로그램을 컴파일해서 실행하면 대화내용이 나온다

그리고 대화 내용에는 비밀번호가 적혀있는것을 알 수 있다.

 

'해커스쿨 FTZ' 카테고리의 다른 글

level12  (0) 2018.03.28
level11  (0) 2018.03.27
level9  (2) 2018.03.26
level8  (0) 2018.03.26
level7  (0) 2018.03.26
블로그 이미지

천재보다는 범재

,

level9

해커스쿨 FTZ 2018. 3. 26. 17:08

level9의 힌트는

 

/usr/bin/bof의 소스코드이다.

buf2[10]이 먼저 선언되고 buf[10]이 선언되었으므로 스택메모리에

 

buf1

buf2

 

순으로 입력되었을 것이다.

 

그러면 buf1의 버퍼의 크기를 넘는 부분에 go를 입력해주면 if(strncmp(buf2, "go", 2) ==0)이 참이된다.

 

몇 자리수가 정확히 오버플로우 되는 부분인지 알 수가 없어서 그냥 go를 연속해서 계속 적었다.

Good Skill!이라는 메시지와 함께 level10의 쉘에 접속한 것을 볼 수 있다.

 

my-pass를 입력하면 비밀번호를 알 수 있다.

 

 

 

'해커스쿨 FTZ' 카테고리의 다른 글

level11  (0) 2018.03.27
level10  (0) 2018.03.26
level8  (0) 2018.03.26
level7  (0) 2018.03.26
level6  (0) 2018.03.26
블로그 이미지

천재보다는 범재

,