Try to be the expert.

Ainsetin's Hacking & PS & Math

Hacking 31

HackCTF RTL_World Write-up

아까 전에 작성한 Yes or no가 너무 난해해서 이번 문제는 쉽게 풀 듯하다. 문제 풀이 스타트! RTL 문제이다. world가 붙어있는 것을 보니 간단하거나 전형적인 RTL은 아닌듯하다. 우선 checksec부터 해보자. NX만 걸려있는 것을 보니 RTL을 사용할 수 있다는 것을 알 수 있다. 바이너리를 IDA로 까보자. 이 문제에서는 6번까지의 메뉴를 선택할 수 있고, 5번에서 BOF attack을 할 수 있다. 2번으로 돈을 벌거나 3번, 4번으로 system과 binsh의 주소를 알 수 있긴 하다. 하지만 system의 plt값이 고정되어 있고, Shift + F12를 눌러서 문자열 검색을 해보니 /bin/sh이 고정 주소에 있는 것을 알 수 있다. 따라서 우리는 system_plt=0x804..

Hacking/HackCTF 2020.01.06

HackCTF Yes or no Write-up

Yes or no 문제를 해결해보겠다. 이번에 주어지는 파일은 zip 파일이다. 파일이 한 개가 아닌가 보다. 우선 checksec부터 해보자. 쉘 코드만 사용하지 못하도록 되어 있다. 다음, 바이너리를 까 보자. 보니 main함수에서 gets함수를 실행시키는 것이 목표인 듯하다. 그렇다면 gdb로 디버깅하면서 34번째 줄의 if문을 만족하도록 v10값을 찾으면 문제를 풀 수 있을 것이다. main+237줄에서 gets를 호출할 수 있도록 하는 조건인 cmp가 있는 것을 알 수 있다. 따라서 저 부분에 break를 걸고 v10에 임의의 값을 집어넣어 run을 해보겠다. 이 바이너리는 64bit 기반이므로 rax값은 곧 eax값이다. 여기서 [rbp-0x8]에 들어있는 값과 eax의 값을 비교하므로 입력해..

Hacking/HackCTF 2020.01.06

HackCTF BOF_PIE Write-up

이번엔 Buffer OverFlow PIE 문제를 풀어보겠다. PIE가 걸려 있을 것 같지만, 우선 checksec부터 해보자. NX bit와 PIE가 걸려 있는 것을 확인할 수 있다. NX bit는 쉘 코드 실행을 막는 보호 기법이다. 이 문제에서 절대적으로 중요한 보호기법은 PIE 기법이다. PIE 기법이란, 함수를 실행할 때마다 호출할 주소가 고정되어 있는 것이 아닌, 상대 주소를 호출하여 한 번의 단계를 더 거쳐서 다른 함수를 호출하는 것이다. 예를 들어, main함수를 디스어셈블할 때 일반적으로 0x8000xxxx와 같은 주소가 아니라 0x100 같은 아주 작은 주소로 바뀌게 된다. 이 보호 기법을 우회하기 위해서 memory 주소를 leak 하거나 ROP 기법을 활용할 수 있다. 우선 바이너리..

Hacking/HackCTF 2020.01.06

HackCTF offset Write-up

offset 문제는 뭔가 새롭다. 한번 도전해보자. 우선 바이너리 보호 기법부터 살펴보자. 와우.... 지금까지 보지 못한 장면이다. 대표적인 보호 기법이 거의 다 걸려 있다. 즉 우리는 직접 Code, Stack, Data 영역을 실행할 수 있는 권한뿐만 아니라 RET 변조, 쉘 코드 사용까지 전부 다 막혔다는 뜻이다. 다시 말해, 건드릴 수 있는 부분이 한정적이라는 뜻이다. 우선 단서를 찾기 위해 IDA에서 이 바이너리를 파헤쳐보았다. 요약하자면, s 문자열을 받아 select_func 함수에서 이 문자열이 "one"이면 one 함수를 return하고 아니면 two 함수를 return 하는 프로그램이다. 특징으로는 Basic_FSB문제처럼 return에 함수 이름이 들어가는데, 함수 이름이 곧 주소(..

Hacking/HackCTF 2019.12.29

HackCTF Simple_Overflow_ver_2 Write-up

문제 풀이 스타트!! 이번에는 버전 2란다.... 뭐 그래도 많이 달라진건 없겠지... 스타트! checksec 확인부터 해보자. 전 문제와 같이 깔ㅡ끔하다. 그럼 IDA로 디컴파일해보자. 이번에는 코드 분석이 필요할 것 같다. 간단하게 말하자면, Data 문자열을 받은 뒤 s의 주소를 출력하고 그 문자열을 공백 하나하나 붙여서 출력해주는 프로그램이고, Again을 통해 다시 시도할 수 있다. buffer의 주소를 출력하는 것 같아 이번에도 nc 서버에 접속해보았다. 예상한대로 buf의 주소가 달라지는 것을 알 수 있다. 그러나 Again을 해도 달라지지 않았다. 따라서 먼저 아무 값이나 집어넣고 buffer 주소를 leak한 후에 payload를 입력하면 될 것이다. exploit code는 다음과 같..

Hacking/HackCTF 2019.12.23

HackCTF x64 Simple_size_BOF Write-up

x64 기반의 두번째 문제이다. 이번에는 버퍼의 크기가 작거나 매우 크게 주는가보다. 뭐 그래도 풀리긴 할거니까... 도전! 우선 checksec부터 해보자. 깔ㅡ끔 그자체이다. 이번엔 IDA로 바이너리를 까보겠다. 간단하다. s 출력 후 buf의 주소를 알려준 뒤, gets로 그곳에 어떤 값을 넣나보다. 그런데, 문제가 있다. system 함수를 불러오기 위한 함수가 존재하지 않는다. 하지만 걱정하지 마라, (손은 눈보다 빠르니까) 버퍼의 크기가 워낙 크므로 64bit를 기반으로 한 쉘코드를 buffer에 집어넣는 것이 좋을듯 하다. 우선 31byte 크기의 64bit 쉘코드를 찾았다. "\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x48\x31\xc0\x50\x48\xbb\x2f..

Hacking/HackCTF 2019.12.23

HackCTF x64 Buffer Overflow Write-up

이번에는 64bit 기반의 바이너리 문제를 풀어보도록 하겠다. 일단 보호 기법부터 확인하자. Full RELRO가 걸려 있고, NX bit가 걸려 있는것을 보니 RET 변조만 가능할 것 같다. 즉, 기본적인 x64 BOF인 것이다. 64bit 기반에서는 SFP와 RET가 각각 8byte로 이루어져 있는것 빼고는 32bit 기반과는 거의 똑같다. IDA로 코드부터 보자. s의 크기가 0x110=272byte이고 SFP 8byte를 더미로 넣으면 된다! 문제는, system함수를 실행시키는 것이 필요한데... 그런데 함수 목록을 보니 callMeMaybe라는 함수를 볼 수 있었다...!! 딱보니 쉘을 실행시키는 함수였다...!! 이 함수의 주소는 0x400606이고 RET에 이 주소를 넣으면 될 것이다. e..

Hacking/HackCTF 2019.12.23

HackCTF 내 버퍼가 흘러넘친다!!! Write-up

오늘은 Pwnable 3번째 문제, "내 버퍼가 흘러넘친다!!!"를 풀어보겠다. 우선 바이너리를 체크하니 아무것도 걸려 있지 않았다. 따라서 쉘코드를 충분히 사용할 수 있고, RET 변조가 가능하다. read 함수와 gets 함수가 있는데, 함수의 에필로그까지 간 다음 RET가 존재하므로 gets에서 BOF를 일으키면 된다. 그런데 s의 크기가 20byte밖에 되지 않아 쉘코드를 저장할 수 없다. 따라서 버퍼에 더미값을 넣고 쉘코드를 버퍼 밖에 저장한 뒤, RET를 변조하여 쉘코드 주소를 가리키게 하면 flag를 획득할 수 있을 것이다. 우선 gdb로 stack을 활용하기 위한 준비 과정을 거쳐보자. gets 다음 main+78에 break를 걸면 될 것이다. 0x41부분은 buffer이고, 0x42부분..

Hacking/HackCTF 2019.12.23

HackCTF Basic_FSB Write-up

이름만 봐도 포맷 스트링 공격을 해야 할 것 같은 비주얼이다. 그럼 풀이 시작해볼까...! checksec으로 확인하니 전혀 문제될 것이 없었다. 그럼 IDA로 까보도록 하겠다. vuln함수를 호출하는 것을 볼 수 있다. 그럼 들어가 봐야지! 보니까 snprintf로 format에 s의 내용을 복사하는 것 같았다. 진짜는 return줄이다. printf의 인자에 format의 주소가 있고, 다른 인자는 없다. 이때 사용하는 공격 기법을 FSB(Format-String Bug)라고 한다. F S B (Format-String Bug) printf에는 다양한 출력 포맷이 있다. %d, %s, %c, %f, %n 등이 존재한다. 그런데 우리가 기본적으로 보는 printf 함수의 사용법은 " printf("%d..

Hacking/HackCTF 2019.12.22

HackCTF Basic_BOF #2 Write-up

가즈아!! 이번엔 Basic_BOF #2를 풀어보겠다. binary의 보호 기법을 확인하니, 전 문제와 똑같이 NX가 걸려 있는 것을 볼 수 있다. 이 말은 쉘코드를 사용할 수 없다는 의미이기도 하다. 그럼 IDA로 까보자. 이번엔 main을 까 봤더니 그냥 sup함수를 호출하고 s를 입력받고 v5를 실행하는 간단한 함수였다. sup 함수는 그냥 s를 출력하는 함수였다.. shell 함수도 존재해서 디컴파일 해보았다. system 함수를 호출하는 함수이다!! 따라서 우리는 BOF를 일으켜 RET 변조를 해야 한다. 그런데 s의 크기는 16진수 8C, 즉 140byte이다... fgets에서 133byte밖에 입력을 못하기 때문에 RET 변조는 불가능하다. 결정적인 것은,, main에서 v5가 sup 함수..

Hacking/HackCTF 2019.12.22