
분석부터 진행하겠다.

보안없다.
스택에 그냥 쉘코드 올리면 될 것 같다.
#include <stdio.h>
#include <stdlib.h>
#include <signal.h>
#include <unistd.h>
void alarm_handler() {
puts("TIME OUT");
exit(-1);
}
void initialize() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
signal(SIGALRM, alarm_handler);
alarm(30);
}
int main(int argc, char *argv[]) {
char buf[0x80];
initialize();
printf("buf = (%p)\\n", buf);
scanf("%141s", buf);
return 0;
}
buf[0x80]으로 128만큼 배열 생성scanf(”%141s”,buf)로 141만큼 입력받음 → 오버플로우 발생printf("buf = (%p)\\n", buf); 로 스택 상 버퍼 시작 주소 유출해줌nm, string 결과상 read_flag나 cat flag, /bin/sh등 직접 호출/문자열이 전혀 없다.
또한 system() 도 PLT에 없기 때문에, ret2plt(system)도 불가능하다.
libc 주소 누출 경로도 없기 때문에, ret2libc도 불가능하다.
따라서 단순 쉘코드 업로드가 제일 좋을 것 같다. 그러라고 buf 시작 주소도 알려주는 것 같다.

메인 함수 확인해보면, buf 128가 정직하게 선언된다.
[ 낮은 주소 → 높은 주소 ]
buf[128] ← 로컬 버퍼 (0x80 바이트)
saved EBP (SFP) ← 함수 진입 시 push ebp 한 값
saved EIP (RET) ← 함수 리턴 시 복귀할 주소
예상으로는 이런식으로 선언되있다고 보면 될 것 같다.
한번 cyclic을 이용해 계산해보겠다.
