이번에는 darkelf로 가기 위한 패스워드를 구해보자. 일단 wolfman에 지난 시간에 구한 패스워드로 로그인했다.

 

로그인한 후에는 ls명령으로 파일 리스트를 확인했다. 이번에는 darkelf.c 파일이 있는 것을 볼 수 있다.

 

해당 파일을 출력해보면 아래와 같다.

코드를 잘 살펴보면 check the length of argument라는 부분이 추가된 것을 알 수 있다. 이 부분 때문에 argv[1]의 크기가 48바이트를 넘으면 안 된다. 즉 ret 영역 뒤에 쉘코드를 삽입할 수 없다. argv[1]에 쉘코드를 넣을 수 없으니 argv[2]에 입력해서 공격해보자.

 

공격에 앞서 argv[2]의 주소를 알아내야 한다. 일단 gdb를 실행시키자. main에서 적당한 부분에 브레이크 포인트를 걸어보겠다.

(사진을 잘 못 올렸는데 b main+3이 아니라 b *main+3이다. 브레이크포인트를 지정할 땐 *를 꼭 붙이자!)

 

그다음 argv[1]에 48개의 \xbf를, argv[2]에는 1000개의 \x90을 입력하고 실행했다. 실행시키면 브레이크포인트에 의해서 ebp가 esp값으로 변경된 후 멈추게 된다. 이제 argv[2]의 주소를 찾아보겠다. ebp로부터 메모리 4개를 출력시키면 순서대로 sfp, ret, argc, argv가 된다. 여기서 0xbffff724에서부터 3개의 메모리를 출력하면 마지막에 출력된 것이 argv[2]의 주소가 된다. 

정말로 맞는지 확인하기 위해서 메모리의 값을 출력해봤다. \x90가 잘 들어간 것을 확인했다. 이중에서 적당한 주소를 골라 공격에 사용하겠다. 나는 \xbffff87a를 선택했다.

 

argv[1]에는 a 44개와 argv[2]주소, argv[2]에는 nop와 쉘코드로 payload를 구성하고 실행시켜봤다.

셀이 성공적으로 실행됐다.

darkelf로 가기 위한 패스워드는 kernel crashed이다.

'Study > System Hacking' 카테고리의 다른 글

[LOB] orge -> troll  (0) 2021.02.09
[LOB] darkelf -> orge  (0) 2021.02.09
[LOB] orc -> wolfman  (0) 2021.02.03
[LOB] goblin -> orc  (0) 2021.02.02
[lazenca] Protection Tech / NX bit(MS: DEP)  (0) 2021.02.02
복사했습니다!