포스팅 썸네일 이미지

War Games/HackCTF

[HackCTF] :pwn: Unexploitable_1

shift+F12를 누르면 다음과 같이 모든 string을 볼 수 있는데, "fflush"안에 sh가 들어있죠? 그래서 이 부분을 이용해서 system을 실행해보려고 합니다. 0x4003BB가 fflush의 시작이니, sh만 불러오고 싶으면 0x4003BF겠죠? 혹시모르니 확인해봅시다. 굳굳 이대로 가봅시다 생각해보니깐 당연히 함수쪽 data에서도 긁어와도 되는건데 한번도 그렇게 해볼 생각이 없었네요..! 근데 평소에는 system주소까지 알아내야하니깐 binsh만 구하기 귀찮은 특수한 상황에만 쓸만하겠네요...

2021.04.03 게시됨

 포스팅 썸네일 이미지

War Games/HackCTF

[HackCTF] :pwn: uaf

봅시다 1. 문제 분석 먼저 add_note입니다. 밑에가 짤리긴 했는데 저정도만 봐도됨. malloc은 총 2번 일어납니다. 크기가 8인 notelist에 한번, 그리고 요청하는 크기의 v0[1]에 한번 더 일어나네요. 다음은 del_note입니다. del_note에서는 해당 notelist[v1]과 v0를 free합니다. 순서정도는 기억해둡시다. (*(notelist[v1]+1)은 노트의 내용) 그리고 마지막으로 print_note 요청한 내용을 출력시켜줍니다. 눈여겨봐줄 부분은 notelist[v1]의 값을 주소로 가져와서 바로 실행시키는 것을 볼 수 있습니다. (이부분도 기억해줍시다.) 아참 magic함수도 있습니다. 당연히 이걸 출력시키는게 목적이겠죠? 2. 취약점 찾기 우선 Use After ..

2021.03.30 게시됨

 포스팅 썸네일 이미지

War Games/HackCTF

[HackCTF] :pwn: pwning

고고 main함수는 바로 vuln함수로 뛰어서 생략! 함수의 전체적인 흐름은 입력하고 싶은 바이트수만큼 입력을 받고, 요청한 만큼 출력을 시켜주는 것으로 보입니다. 근데 입력받는 함수가 평소에 자주쓰는 gets가 아니라 사용자 지정함수네요. 직접 봅시다 값을 입력받아서 하나씩 버퍼에 입력을 해주는 방식이네요. while루프를 빠져나가는 조건은 v4에 값이 할당이 안되었을 경우, \n이 입력된 경우, 그리고 크기가 음수인 경우네요. 근데 a2를 보면 unsigned int인 점을 볼 수 있습니다. 즉, 처음 get_n에서 &nptr에 음수를 입력하면, 두번째 get_n에 음수가 unsigned int로 바뀌면서 결론적으로 0x20보다 훨씬 더 큰 값을 넣을 수 있다는 점을 알 수 있습니다. 이걸가지고 그냥..

2021.03.27 게시됨

 포스팅 썸네일 이미지

War Games/HackCTF

[HackCTF] :rev: static

아이다로 디컴파일링했을때는 아무것도 보이지 않습니다. 뭔가 해서 봤더니, stripped되어있어서 아무것도 볼 수가 없습니다. 일단 프로그램을 실행시켜보면 "nope"와 함께 나가는 걸 기준으로, ghidra를 통해서 찾아봤습니다. 보니 해당 스트링과, 문제에서 쓰이는 것 같은 문자열들이 있네요. 따라서 거기에 해당하는 함수들을 찾아보았습니다. /* WARNING: Removing unreachable block (ram,0x00100b11) */ /* WARNING: Removing unreachable block (ram,0x00100a56) */ undefined8 main(int param_1,long param_2) { int iVar1; char *__s1; __s1 = getenv("team..

2021.03.25 게시됨

 포스팅 썸네일 이미지

War Games/HackCTF

[HackCTF] :pwn: gift

뭐야; 너무좋아 binsh, system모두 주니 바로 이용합시다. 거기다가 printf는 바로 프린트시켜서 fsb도 발생하네요. 그래서 바로 진행해보도록 하겠습니다. 확인해보니깐 binsh에는 아무것도 없네요. 저기에다 입력하면 되겠죠? 시나리오는 다음과 같습니다. 1. binsh에 "/bin/sh"저장 (fsb취약점 이용) 2. system(&binsh) 실행 (ret overwrite 이용) 그럼 바로 해봅시다. 일단 /bin/sh\x00자체를 한번에 16진수로 바꾸어 넣기에는 32비트 환경에서 너무 큽니다. 따라서 잘라서 넣어줘야하는데 str / b i n / s h \x00 hex 0x2f 0x62 0x69 0x6e 0x2f 0x73 0x68 00 각 hex/str값은 이렇게 되어있으니 /b =..

2021.03.24 게시됨

 포스팅 썸네일 이미지

War Games/HackCTF

[HackCTF] :pwn: Look at me

고고 아이다를 열었는데 함수가 900개가 있는 프로그램이고, 보니깐 다 원래 있던 함수에요! 뭔가 이상해서 파일 자체를 보니 뭐야 스태틱 링크네요 이게 뭔가싶어서 봤지만 흠 system과 exec함수들 다 없네요... 그래서 찾은 방법이 mprotect를 이용한 rop입니다. dokhakdubini.tistory.com/421 [STACK] mprotect ROP ROP using mprotect 오늘은 기존의 ROP와는 조금 다른 것을 해보려고 합니다. 기존에는 system함수를 이용해서 권한을 얻는 식이라면, 이번에는 mprotect함수를 이용해서 권한을 획득하는 방식의 ROP에 대 dokhakdubini.tistory.com 제가 쓴 글이나 mprotect rop하면 라젠카 글이 가장 먼저 뜹니다...

2021.03.23 게시됨

 포스팅 썸네일 이미지

War Games/HackCTF

[HackCTF] :pwn: Beginner_Heap

ㄲ 힙이네요. 보면 각각 v3+1, v4+1의 주소에 8만큼 malloc하는 것을 볼 수 있습니다. 8만큼 malloc하면 |prev_size[4]| |size[4]| |data[8]| 의 식으로 할당되어있고, 전체적인 heap구조는 다음과 같겠죠? |v3[16+8]| |v3+1[8+8]| |v4[16+8]| |v4+1[8+8]| 첫번째 fgets에서 heap overflow를통해서 v4+1에 해당하는 곳에 exit의 got를 써놓고, 두번째 fgets에서 getflag함수로 덮어씌우면 될 것 같습니다. getflag가 뭐냐구요? 원래는 sub_~~였는데 제가 이름 바꾼겁니다. 아무튼 작성해줍시다. 굳굳

2021.03.22 게시됨

 포스팅 썸네일 이미지

War Games/HackCTF

[HackCTF] :pwn: poet

봅시다 차례대로 get_poem, get_author, rate_poem을 지나서 0x6024E0의 값이 1000000이면 while문을 벗어나고, reward함수가 실행됩니다. reward함수는 바로 플래그를 읽어주네요. while문에서 나오는것만 집중하면 될 것 같습니다. 다음은 get_author부분인데, gets로 받아서 입력에 제한이 없네요. 보면 0x6024A0에 입력을 받는데, 값을 확인하는 부분이 0x6024E0이므로 그냥 overwrite해주면 될 것 같습니다. 굳굳

2021.03.18 게시됨