BOF(27)
-
pwnable.xyz - note
main int __cdecl main(int argc, const char **argv, const char **envp) { int v3; // eax setup(argc, argv, envp); puts("Note taking 101."); while ( 1 ) { while ( 1 ) { while ( 1 ) { print_menu(); v3 = read_int32(); if ( v3 != 1 ) break; edit_note(); } if ( v3 != 2 ) break; edit_desc(); } if ( !v3 ) break; puts("Invalid"); } return 0; } edit note void edit_note() { int v0; // [rsp+4h] [rbp-Ch] void..
2021.09.11 -
HACKCTF - Unexploitable #1
문제화면입니다. 해당 문제를 실행시켜보면 출력하나시키고, 입력하다받고 끝나내요. 아마 입력부분이서 취약점이 존재할 것 같습니다. IDA를 통해 이 부분을 확인해보면 변수보다 fgets에서 읽어들이는 사이즈가 더 크니 BOF취약점이 발생하게 됩니다. 보호기법을 확인하면 leak한 후에 ROP를 통해 shell을 획득할 수도 있을 것 같은데. system가젯을 일부러 준 친절하신 출제자와, string부분을 보면 있는 fflush부분에서 sh부분만 추출 해 오면 되니 이 부분을 활용해주면 ex가 가능할 것 같습니다. payload는 아래와 같습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 from pwn import * r = remote(..
2020.09.13 -
HACKCTF - Poet
해당 문제를 실행해보면 이런식으로 무언가 1,000,000점수를 획득해야한다네요. ida로 코드를 확인해보면 rete_poem 함수를 보면 poem에 입력받았던 문자중에 해당 단어가 있을경우 100점을 주는 제도인데, 예를들어 CTF를 1000000번 입력하게되면 풀리겠지만, poem버퍼가 400이라 넘어 가서 해당 방식으로 풀면 안되겠다고 생각했습니다. 우리의 궁극적은 목표가 점수를 1,000,000으로 만드는것이기에 해당 버퍼를 1,000,000으로 덮는 방법으로 진행해보겠습니다. author의 이 변수가 이 위치에 있고. rate poem 의 점수 변수가 이 위치에 있으니 이 차를 구해서 dummy를 채워주고, 1,000,000을 넣어주면 됩니다. 이를 코드를 작성하면 다음과 같습니다. 1 2 3 ..
2020.09.07 -
HACKCTF - RTL_World
RTL을 활용해서 푸는 문제로 보이고, 파일하나를 주니 다운받아서 실행했습니다. 장문의 text형식 (case문) 의 문제 구성이군요. 3번과 4번을 보게되면 3번에서 sys함수주소를주고, 4번에서 binsh 주소를 줍니다. 12번줄 --> system주소 14번줄 --> /bin/sh 찾기 이렇게 두개의 함수를 얻으면 바로 exploit이 가능합니다. 취약점이 발생하는 부분은 5번을 누르게되면 입력받는 창이 나오는데 이 부분에서 bof가 일어나게됩니다. 익스플로잇코드는 dummy[0x8c] + sfp[0x4] + system주소 + dummy[0x4] + binsh주소 입니다. 초기에 돈을 많이 벌어둬야지 3,4번이 가능하므로 해당 코드도 추가하면 됩니다. 아래는 exploit코드입니다. 1234567..
2020.08.16 -
HACKCTF - 1996
pwnable문제입니다. 1996 파일 하나 주는데 해당 파일을 실행시켜보면 이렇게 인풋하나를 받고 다시 출력시켜줍니다. 16번째 줄을보면 해당중에서 name을 받고 shell을 띄워주는 함수가 있으니 ret를 여기로 주면 될 것 같습니다. 페이로드는 아래와 같습니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 from pwn import * r = remote("ctf.j0n9hyun.xyz", 3013) #r = process("./1996") e = ELF("./1996") context.log_level = "debug" shell = 0x0000000000400897 r.recvuntil("? ") payload = "" payload += "A"*0x410..
2020.08.06 -
HACKCTF - Simple_Overflow_ver_2
말그대로 간단한 오버플로우인가 하고 생각하고 들어갔습니다. 팁하나 추가로 드리면 64비트인지, 32비트인지 확인하고 시작하시면 좋습니다. "file [파일명]" 입력하면 확인하실 수 있습니다. 그리고 64비트를 32비트ida에서 열었을 경우 tab이 안먹습니다. 이렇게 발견해도 되긴 합니다 ㅎㅎ 그럼 다시 본론으로 들어갈게요 ~ 값을 하나 입력받고, y를 누르면 계속 반복, n을 누르면 끝나는 그런 간단한 구조네요. main함수를 보면 이때까지 보았던것 과는 다르게 약간 복잡해 보입니다. 13번째에서 값을 입력받고, 그 아래는 출력하는 명령어인데
2020.07.14