본문 바로가기

시스템 해킹59

[HackCTF] Poet __int64 get_poem() { __int64 result; // rax printf("Enter :\n> "); result = gets(poem); dword_6024E0 = 0; return result; } __int64 get_author() { printf(&byte_400C38); return gets(&unk_6024A0); } int rate_poem() { char dest[1032]; // [rsp+0h] [rbp-410h] BYREF char *s1; // [rsp+408h] [rbp-8h] strcpy(dest, poem); for ( s1 = strtok(dest, " \n"); s1; s1 = strtok(0LL, " \n") ) { if ( !strcmp(s1, "ESP.. 2021. 9. 21.
[HackCTF] RTL_ World int Get_Money() { int result; // eax int num2; // [esp+8h] [ebp-Ch] BYREF int v2; // [esp+Ch] [ebp-8h] int v3; // [esp+10h] [ebp-4h] puts("\nThis world is F*cking JabonJui"); puts("1) Farming..."); puts("2) Item selling..."); puts("3) Hunting..."); v3 = 0; v2 = rand(); printf("(Job)>>> "); __isoc99_scanf("%d", &num2); result = num2; if ( num2 == 2 ) { puts("\nItem selling..."); while ( v3 2 ) { .. 2021. 9. 19.
[HackCTF] Yes or no int __cdecl main(int argc, const char **argv, const char **envp) { int v3; // eax int v4_0; // eax int v5_200; // ecx int v6_6; // eax int v7; // eax char input_str[10]; // [rsp+Eh] [rbp-12h] BYREF int input_num_9830400; // [rsp+18h] [rbp-8h] int v11; // [rsp+1Ch] [rbp-4h] setvbuf(stdout, 0LL, 2, 0LL); v11 = 5; puts("Show me your number~!"); fgets(input_str, 10, stdin); input_num_9830400 = atoi(.. 2021. 9. 14.
[HackCTF] BOF_PIE void j0n9hyun() { char s[40]; // [esp+4h] [ebp-34h] BYREF FILE *stream; // [esp+2Ch] [ebp-Ch] puts("ha-wi"); stream = fopen("flag", "r"); if ( stream ) { fgets(s, 40, stream); fclose(stream); puts(s); } else { perror("flag"); } } int welcome() { char v1[18]; // [esp+6h] [ebp-12h] BYREF setvbuf(stdin, 0, 2, 0); setvbuf(stdout, 0, 2, 0); puts("Hello, Do you know j0n9hyun?"); printf("j0n9hyun is %p.. 2021. 9. 14.
[HackCTF] Offset int __cdecl select_func(char *src) { char dest[30]; // [esp+Eh] [ebp-2Ah] BYREF int (*v3)(void); // [esp+2Ch] [ebp-Ch] v3 = two; strncpy(dest, src, 31u); if ( !strcmp(dest, "one") ) v3 = one; return v3(); } int print_flag() { char i; // al FILE *fp; // [esp+Ch] [ebp-Ch] puts("This function is still under development."); fp = fopen("flag.txt", "r"); for ( i = _IO_getc(fp); i != -1; i = _IO_getc(f.. 2021. 9. 14.
[HackCTF] Simple_Overflow_ver_2 int __cdecl main(int argc, const char **argv, const char **envp) { size_t v3; // ebx char v5; // [esp+13h] [ebp-89h] BYREF char s[128]; // [esp+14h] [ebp-88h] BYREF int i; // [esp+94h] [ebp-8h] setvbuf(stdout, 0, 2, 0); v5 = 121; do { printf("Data : "); if ( __isoc99_scanf(" %[^\n]s", s) ) { for ( i = 0; ; ++i ) { v3 = i; if ( v3 >= strlen(s) ) break; if ( (i & 0xF) == 0 ) printf("%p: ", &s[i]);.. 2021. 9. 13.
[HackCTF] x64 Simple_size_BOF int __cdecl main(int argc, const char **argv, const char **envp) { char v4[27952]; // [rsp+0h] [rbp-6D30h] BYREF setvbuf(_bss_start, 0LL, 2, 0LL); puts(&s); printf("buf: %p\n", v4); gets(v4); return 0; } 문제 코드는 위와 같다. main 함수의 ret을 바로 덮어씌우려고 했으나 aslr이 걸려있어서 매번 주소가 바뀌기 때문에 문제에서 주어진 buf 주소를 사용해야한다. buf주소를 받을 때 puts로 주소를 출력할 때는 8바이트 크기로 받았었는데 ㅣ번 문제에서는 printf로 주소를 출력해서 그런지 16바이트 크기로 받아야 주소를 받을 수 있다... 2021. 9. 13.
[HackCTF] x64 Buffer Overflow int callMeMaybe() { char *path[4]; // [rsp+0h] [rbp-20h] BYREF path[0] = "/bin/bash"; path[1] = "-p"; path[2] = 0LL; return execve("/bin/bash", path, 0LL); } int __cdecl main(int argc, const char **argv, const char **envp) { char s[268]; // [rsp+10h] [rbp-110h] BYREF int v5; // [rsp+11Ch] [rbp-4h] _isoc99_scanf("%s", s); v5 = strlen(s); printf("Hello %s\n", s); return 0; } IDA로 분석하면 main함수와 call.. 2021. 9. 13.
[HackCTF] 내 버퍼가 흘러넘친다!!! int __cdecl main(int argc, const char **argv, const char **envp) { char s[20]; // [esp+0h] [ebp-14h] BYREF setvbuf(stdout, 0, 2, 0); printf("Name : "); read(0, &name, 50u); printf("input : "); gets(s); return 0; } 문제 코드는 위와 같습니다. 핵심 주소는 다음과 같습니다. main ebp => 0xffffd508 name(.bss) => 0x804a06 s => ebp - 0x14 풀이는 간단합니다. name에 쉘코드를 입력하고 gets로 main ret을 쉘코드 주소인 0x804a06으로 덮어씌우면 끝입니다. 익스플로잇 코드는 아래와 같.. 2021. 9. 12.