[root-me.org] ELF x86 - Format string bug basic 1 Write-Up

두비니

·

2019. 11. 2. 18:40

 

 

::Login::

Host challenge02.root-me.org
Protocol SSH
Port 2222
SSH access ssh -p 2222 app-systeme-ch5@challenge02.root-me.org     WebSSH
Username app-systeme-ch5
Password app-systeme-ch5

 

 

 

::Code::

#include <stdio.h>
#include <unistd.h>

int main(int argc, char *argv[]){
        FILE *secret = fopen("/challenge/app-systeme/ch5/.passwd", "rt");
        char buffer[32];
        fgets(buffer, sizeof(buffer), secret);
        printf(argv[1]);
        fclose(secret);
        return 0;
}

 

 

보면 buffer 안에 password가 들어가있고, buffer를 입력받아 argv[1]을 출력시키네요. 그러면 argv1에 %x를넣어서 한번 확인해봅시다. %8x를 입력하면 stack의 맨 위부터 차례로 출력하게 된다.

다음이 출력값이다.

일단 내가 추측한 stack의 구조이다.

 

 

|      buffer     | >> "AAAA"
| sizeof(buffer) | >> "20"
|      secret     | >> "804b160"
|                   | >> "9bffffcd4b7e1c4a9bffffba4b7fc4000b7fc4000...."

 

사실 저 secret 이후의 정보는 잘 모르겠다. 근데 저 값들중에 하나는 *secret의 정보가 있겠거니하고 그 뒤에값들을 아스키코드로 바꾸어보았다. 

 

 

위에 값과 다른이유는 어떤이유에서인지는 모르겠지만 저걸 떨어져있는상태로 출력시키니까 답이 안나와서 %8x대신에 %08x로 출력하여 다같이 변환해벼렸다. 결론적으로 변환하니 보이는 한 string이 있는데, 

 

9apD()6dmapE

요놈이다. 이렇게 입력하면 안되는게, 리틀엔디안 방식에 의해 4글자씩 잘라 반대로 적어주어야 한다.(사실 왜 네글자인지는 모르겠다. 두글자씩 되돌려야하는거 아닌가?)

 

그래서 네글자씩 반대로 돌리면

 

Dpa9d6)(Epamd

 

끝! next