zj3t

email: euntaejang@gmail.com

Latest Posts

pwnable.kr - echo1

By 오전 2:04 ,

exploit을 적용해야하는 프로젝트를 진행하고 있는데, 그 공부를 하던 중 익스 공부를 너무 쉰거같다는 느낌을 받아서 pwnable.kr 의 echo1 문제를 풀게 되었습니다.







소스 코드는 요즘 ida에서 왠만한 거는 다 번역해주니 필요한 부분만 올리겠습니다.

우선 취약점이 터지는 부분은 echo1() 함수 안에서 였습니다.

__int64 echo1()
{
  char s; // [bp-20]

  (*((void (_QWORD))o + 3))(o); //greetings
  get_input(&s, 128LL);  //get_input
  puts(&s);
  (*((void (_QWORD))o + 4))(o); //byebye()
  return 0LL;
}

이 부분인데 

main 함수 안에서

id = user_name[0]; //input value(8byte)

getchar();

func[0] = (__int64)echo1;
...
...
...
        puts("\n- select echo type -");
        puts("- 1. : BOF echo");
        puts("- 2. : FSB echo");
        puts("- 3. : UAF echo");
        puts("- 4. : exit");
        printf("> ", v3);
        v3 = &selection;
        __isoc99_scanf("%d", &selection);
        getchar();
        if ( (unsigned int)selection > 3 )
          break;

        ((void (const char *, int *))func[(unsigned __int64)(unsigned int)(selection - 1)])("%d", &selection);


1번을 선택하면 echo1 함수를 호출 할 수가 있습니다.
나머지 echo2나 echo3은 함수는 이 문제에서는 신경 쓸 필요가 없었습니다.

echo1 함수 안을 보면

32크기의 s 변수에 128 만큼의 값을 쓸 수 있도록 만들어 놓았습니다.

그렇다면 ret 까지 덮어서 원하는 공격을 수행할 수 있습니다.

일단 취약점이 터지는 부분은 알았는데 어떻게 공격을 수행해야 할까요??

저기 빨간색글씨들이 공격에 필요한 요소들입니다.
-----------------------------------------------------------------------------------------
프로그램을 보면,

1. name을 입력받는다.
2. id에 입력한 name을 저장한다.
3. 메뉴를 선택한다.
4. 1번 선택시 echo1() 함수로 들어간다.
5. echo1()에서 변수 s 를 덮어 씌울 수 있는 입력을 수행할 수 있다.
----------------------------------------------------------------------------------------

페이로드는 아마도...이런식?? 이 될 꺼같아요..(64bit임을 주의)
payload = |   nop slop(32) |  rbp (8) | ret | ......|

우선 id 가 중요하게 작용합니다. 저두 이걸 몰라서 해맸었습니다.
왜냐면 id 변수는....


bss영역에 있었습니다. 이 영역은 해커들의 영역이라고도 불리며 aslr의 영향을 받지 않는 곳으로 알려져 있습니다.

id 변수에서 내가 입력한 name을 저장하고, 그 name은 8 byte이므로 확실히 이 곳에 필요한 주소를 넣어 줄 수가 있습니다.

그럼 이 곳에 어떤 주소를 넣어 주어야 할까요?? 아마 jmp rsp 아닐까요??

왜냐하면 저는 사용할 페이로드가 

'A'*32+'b'*8+'id_addr(ret)'+'shellcode(64 bit)'

이기 때문입니다. 처음 32bit 쉘코드를 넣다가 계속 안되서 64bit임을 알고 찾아서 넣어줬더니 성공했습니다.

여기서 ret 을 하게 되면 id주소로 뛰게 되고(.bss 영역) id에는 jmp rsp 의 주소가 들어있기 때문에 jmp rsp 명령이 수행되게 됩니다.

ret이 수행되고 난후 스택은 rsp+8(64bit)가 되고 넣어준 shellcode를 가리키게 됩니다. 

그럼 파이썬으로 익스코드를 짜서 공격을 할 수가 있습니다.

풀이는 여기 까지 하겠습니다!!!





You Might Also Like

0 개의 댓글