분류 전체보기(324)
-
Offset 풀이
원래 다른 오버플로우 문제들은 다 실행파일을 줬는데 이 문제는 공유 라이브러리 형식으로 된 문제를 주네요? 우선 분석부터 해보겠습니다. v5에 main함수 인자 개수를 대입합니다. 그리고 문자열 하나를 출력 후 gest로 char형 배열 s를 입력받습니다. 그리고 select_func라는 함수에 s의 주소 값을 인자로 넣어 호출합니다. select_func() 함수는 무슨 기능의 함수인지 IDA로 보겠습니다. 함수 포인터인 v3를 선언하고, two로 초기화 해줍니다. 그리고 dest에 우리가 입력한 문자열을 담은 s를 0x1F(10진수로 31)만큼 복사해줍니다. dest가 "one"이면 v3를 one으로 바꿉니다. 그리고 v3() 함수를 호출해서 v3의 리턴 값을 리턴합니다. 이 함수가 끝인 줄 알고 I..
2021.07.14 -
Simple_Overflow_ver_2 풀이
이번 문제는 여태까지 풀었던 Buffer Overflow문제들보다 소스코드가 조금 복잡해 보입니다. 우선 문제 파일을 실행시켜보겠습니다. 코드랑 같이 보면서 설명하도록 하겠습니다. 우선 do-while 반복문을 사용하는데, do의 첫 부분에서 88-14=74(10진수로 116) 크기의 char형 배열 s를 \n(줄 바꿈 이스케이프 시퀸스)이 나오기 전까지 입력받습니다. 그리고 for문으로 들어가는데, size_t 형식의 변수 v3에다가 int형 변수 i를 대입합니다. 저는 여기서 size_t라는 타입을 처음 봐서 구글에 서칭을 조금 해봤습니다. size_t는 해당 시스템에서 어떤 객체나 값이 포함할 수 있는 최대 크기의 데이터를 표현하는 타입으로 반드시 unsigned 형으로 나타낸다. 나무위키에 siz..
2021.07.14 -
x64 Simple_size_BOF 풀이
char형에 크기 6D30(10진수로 27,952)인 배열 v4를 선언합니다. 그리고 s를 출력합니다. main함수 안에는 s가 선언되지 않은걸 보니 전역 변수로서 bss영역에 있을 것 같네요. 그리고 v4의 주소값을 출력해준 뒤에 v4를 입력받습니다. 이렇게만 봐서는 s가 무엇을 하는 변수인지 잘 모르겠으니 직접 실행파일을 실행시켜보겠습니다. s는 필요없는 변수였습니다. 이제 어떻게 문제를 풀지 생각해보겠습니다. 먼저 v4에 쉘코드를 집어넣고 그 뒤에 있는 buf 영역은 쓰레기 값으로 채우고, sfp(long long이니까 8byte)도 쓰레기 값으로 채워줍니다. 그 뒤에 있는 ret 부분에는 아까 printf에서 출력한 buf 주소를 가져다 넣으면 쉘코드가 실행될 것 같습니다. from pwn imp..
2021.07.13 -
내 버퍼가 흘러넘친다!!! 풀이
우선 char형 배열 s를 선언합니다. s의 크기는 0x14(10진수로 20)입니다. 그리고 read 함수로 0x32(10진수로 50) 크기의 name을 입력받는데... 저 name은 main 안에 없는거 보면 아마 전역 변수인 것 같습니다. 그리고 gets 함수로 s를 입력받습니다. 일단 name, s 둘 다 오버플로우의 가능성은 있어보입니다. 우선 입력받는 순서대로 name을 먼저 보고, 그다음 s를 보겠습니다. name을 전역 변수라고 생각하고 Shift+F7로 bss 영역을 열어봤습니다. IDA 쓰시는 다른 분들 블로그 보니 단축키가 아주 잘 정리돼있더라고요...ㅎㅎ 감사합니다 역시나 bss영역에 name이 있었습니다. name의 주소는 0x804A060이라고 나와있습니다. 기본적인 정보 수집은 ..
2021.07.12 -
basic_exploitation_000 풀이
#include #include #include #include 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; } basic_exploitation_000.c 파일의 소스코드입니다. main문부터 차근차근..
2021.07.11 -
basic_exploitation_001 풀이
#include #include #include #include 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); } void read_flag() { system("cat /flag"); } int main(int argc, char *argv[]) { char buf[0x80]; initialize(); gets(buf); return 0; } 이 코드는 basic_exploitation_001.c 파일에 들어있는 소스코드입니다..
2021.07.10