void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
일정 시간이 넘어가면 "TIME OUT"을 출력하고 에러 강제 종료한다.
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
초기화하는 함수로 보인다.
이름이 같은 setvbuf가 두 개 있는데, 하나는 입력버퍼, 다른 하나는 출력 버퍼인 것 같다.
signal() = 시그널 처리 방법을 설정하는 함수다. 얘가 알람 설정하는 놈인것같다. 30초 지나면 time out을 출력하도록 하는 놈인 것 같다. 위에 선언된 void alarm_handler()가 이 함수의 인자로 들어가 있는 것으로 보인다.
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
printf("buf = (%p)\n", buf);
scanf("%141s", buf);
return 0;
}
%p로 buf의 주소를 16진수로 출력한다.
%141s로 버퍼에 뭔가를 입력받는 것 같다.
buf의 크기는 0x80 = 128바이트이다. 그런데 입력받는 건 141바이트만큼 입력받는거라고 한다.
버퍼의 크기보다 크게 입력받으면 버퍼오버플로우가 발생하게 된다.
128바이트 + 4바이트 = 132바이트를 쉘 코드와 nop로 채우고 ret에 buf 주소를 덮어 씌우면, return 후 shell code가 실행된다.
문제점은 initialize 함수에 의해서 정해진 시간 내에 출력된 buf의 주소를 보고 직접 쉘 코드를 입력하기가 어렵다.
여기서 pwntools를 활용할 수 있다.
ret = return address?
26바이트 쉘 코드를 payload에 저장하고, 아무의미없는 nop로 106바이트를 채워준다.
ret에 buf 주소를 덮어씌운다. -> 32비트 리틀엔디안 패킹 방식으로 넣어준다.
interactive가 호출되면 interactive 모드로 바뀌어서 그 위치에서 사용자의 입력으로 프로그램 조작이 가능해진다.
DH{465dd453b2a25a26a847a93d3695676d}
'시스템 해킹' 카테고리의 다른 글
gdb 분석 실습 (0) | 2022.08.18 |
---|---|
3주차 질문 (0) | 2022.08.13 |
Buffer Overflow (0) | 2022.08.12 |
pwnable.kr collision (0) | 2022.08.12 |
set UID (0) | 2022.08.10 |