wargame
-
[HackCTF : Pwnable] Beginner_Heap(250p)Wargame/HackCTF 2021. 12. 24. 15:26
[HackCTF : Pwnable] Beginner_Heap(250p) 2번 입력받고 종료한다. v3, 3+1, v4 v4+1에 동적 할당을 해준다. flag를 읽어주는 함수가 존재한다. 입력 받기전의 힙 상태이다. v3 = 1 (v3+1) = 0x6022c0 v4 = 2 (v4+1) = 0x602300 첫 번째 입력으로 이곳에 데이터가 들어가는데 bof를 통해 v4+1을 조작할 수 있다. 1 2 3 4 5 6 7 8 9 10 11 from pwn import * p = remote("ctf.j0n9hyun.xyz",3016) e = ELF("./beginner_heap.bin") payload = "A"*40 + p64(e.got['exit']) p.sendline(payload) p.sendline(..
-
[HackCTF : Pwnable] Yes or no (150p)Wargame/HackCTF 2021. 8. 30. 15:26
[HackCTF : Pwnable] Yes or no (150p) 실행해보면 숫자 입력을 받고 종료한다. do_system+1094 관련해서 찾아보니 system함수를 실행할 때 피연산자[rsp+0x40]가 16byte로 정렬되어야 한단다. 입력받은 숫자가 35줄 조건에 맞으면 gets함수가 실행된다. 비교하는 부분에 break를 걸고 값을 확인해보자. 0x960000 여기서 RTL을 이용하면 되는데 ASLR 때문에 메모리 leak을 통해 libc_base를 구해줘야 한다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 from..
-
[HackCTF : Pwnable] Random Key (200p)Wargame/HackCTF 2021. 7. 12. 10:51
[HackCTF : Pwnable] Random Key (200p) 문제 파일을 실행하면 이렇게 key를 입력받는다. 바로 ida로 확인해보자. 입력받은 값이 rand() 함수로 생성된 key값과 같아야 한다. srand에 현재 시간을 불러와서 rand 함수를 실행하기 때문에 같은 시간에 rand 함수로 key값을 만들어주면 된다. 이렇게 똑같은 코드를 짜주고 컴파일해준다. 이제 실행과 동시에 nc로 접속하면 된다. HackCTF{5087686686858549173307745189}
-
[HackCTF : Pwnable] Poet (200p)Wargame/HackCTF 2021. 7. 9. 14:38
[HackCTF : Pwnable] Poet (200p) 먼저 실행해보면 Enter : 이렇게 내용을 입력받고 저자를 입력받는데 1,000,000 점이 필요한 것 같다. dword_6024E0이 1000000이면 while문을 탈출하고 reward함수를 실행한다. flag를 읽어준다. 그리고 나머지 함수들을 살펴보자. poem이라는 변수에 입력을 받고 dword_6024E0에 0을 넣기 때문에 이 함수는 이용하지 못할 것 같다. &unk_6024A0에 입력을 받는다. dword_6024E0와 같은 bss영역이기 때문에 여기서 오버플로우를 일으켜 dword_6024E0를 1000000으로 만들면 될 것 같다. 0x6024E0 - 0x6024A0 = 0x40 만큼 dummy로 채우고 1000000을 넣어..
-
[HackCTF : Pwnable] RTL_Core (250p)Wargame/HackCTF 2021. 7. 8. 17:51
[HackCTF : Pwnable] RTL_Core (250p) 실행해보니 코어 파일에 액세스 하기 위해서 패스코드가 필요한 것 같다. 입력받은 것을 check_passcode함수로 넘기고 그 return값이 hashcode와 같아야지 core함수가 실행된다. hashcode = 0xC0D9B0A7 for문 돌 때마다 입력받은 값의 주소에 4byte씩 더해가며 들어있는 값을 더한다. 즉 0xC0D9B0A7를 5로 나눈값을 20바이트에 갈쳐서 넣어주면 된다. 0xC0D9B0A7를 5로 나누면 0x2691F021인데 나누어 떨어지지않고 2가 부족하기 때문에 0x2691F021 * 4 + 0x2691F023 이렇게 해줘야 한다. 자세히 보기 위해 gdb를 이용했다. check_passcode가 끝날 때에 br..
-
[HackCTF : Reversing] Handray (100p)Wargame/HackCTF 2021. 7. 8. 10:45
[HackCTF : Reversing] Handray (100p) 문제에서 주어진 파일을 받아봅시다. 64bit ELF 이렇게 권한 주고 실행해보면 flag를 뛰어넘었다고 한다. gdb로 까보면 main+15에서 cmp DWORD PTR [rbp-0x4], 0x0 이렇게 비교를 하는데 이게 같지 않으면 main+103으로 가서 "flag를 뛰어넘었습니다!"를 출력한다. 그럼 DWORD PTR [rbp-0x4]를 0으로 바꿔서 실행해보자. 비교하기 전에 break를 걸고 실행한다. 값을 0으로 바꿔준다. flag is HackCTF{HotToHanDleC0ldT0H000ld!}
-
[HackCTF : Reversing] Reversing Me (100p)Wargame/HackCTF 2021. 7. 8. 10:25
[HackCTF : Reversing] Reversing Me (100p) 문제를 보면 c코드가 주어져있다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #include #include int main() { int i; char *serial = "H`cjCUFzhdy^stcbers^D1_x0t_jn1w^r2vdrre^3o9hndes1o9>}"; char enter[54]; printf("키를 입력하시게 : "); scanf("%s", enter); if (strlen(enter) == strlen(serial)) { for (i = 0; i