HackCTF(10)
-
You are silver 풀이
이번 문제는 실행하자마자 세그먼트 폴트가 떴습니다. 우선 코드 분석부터 하겠습니다. 처음 main() 함수에서 fgets() 함수로 46 길이의 문자열을 입력받습니다. 그리고 printf(&s)로 입력받은 문자열을 출력하는데, 이 부분에서 FSB가 발생한다는 걸 알 수 있습니다. 그리고 get_tier() 함수에 인자로 v6의 초기값인 50을 넣어주고, 그 반환 값을 v5에 저장합니다. get_tier() 함수는 조건 분기문으로 사용자의 티어를 판별해주는 함수입니다. 인자가 50으로 들어왔으니 "You are silver"를 출력하게 되고, 1을 리턴해줍니다. 다시 main() 함수로 돌아오면 v5의 값(1)을 주소로 하는 값을 출력하도록 되어있습니다. 그렇기에 이 부분에서 세그먼트 폴트가 발생하게 되고..
2021.11.22 -
RTL_Core 풀이
안내 문자열을 출력해주고, gets() 함수로 s를 입력받습니다. 그리고 if문으로 가면 check_passcode() 함수에 s를 인자 값으로 넣은 리턴 값이 hashcode와 같냐는 조건이 보입니다. hashcode는 이따가 주소 값을 좀 찾아보도록 하겠습니다. 그럼 이제 check_passcode() 함수를 분석해보겠습니다. v2라는 int형 변수를 선언해서 0으로 초기화해줍니다. 그리고 0~5까지 for문을 돌려서 a1(main() 함수에서의 s)의 인자 값을 4byte씩 증가시키며 v2에 더해줍니다. 그리고 누적된 v2를 리턴합니다. 이제 hashcode의 주소 값을 확인해보겠습니다. 0C0D9B0A7(10진수로 3235492007) s에는 저 주소를 넣어주고 뒷부분을 0으로 채우면 될 것 같습..
2021.07.18 -
RTL_World 풀이
int __cdecl main(int argc, const char **argv, const char **envp) { int result; // eax int v4; // [esp+10h] [ebp-90h] char buf; // [esp+14h] [ebp-8Ch] void *v6; // [esp+94h] [ebp-Ch] void *handle; // [esp+98h] [ebp-8h] void *s1; // [esp+9Ch] [ebp-4h] setvbuf(stdout, 0, 2, 0); handle = dlopen("/lib/i386-linux-gnu/libc.so.6", 1); v6 = dlsym(handle, "system"); dlclose(handle); for ( s1 = v6; memcmp(..
2021.07.17 -
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