Try to be the expert.

Ainsetin's Hacking & PS & Math

전체 글 64

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

2020년은 정말 오지 않을 것이라 생각했다

올해는 내가 18살이 되는 해이다. 시간은 너무나도 빨리 간다. 어른들은 나이를 먹는다고 걱정하시지만, 나보다 나이가 적은 초, 중학생들은 자신이 나이 먹는 것을 긍정적으로 생각한다. 나는 어른이 되기 위한 과정을 한창 거치고 있는 청소년이고, 정말 애매모호한 시기를 겪고 있다. 그래서 2019년은 정말 고민도 많았고, 인생의 터닝 포인트를 많이 만났었다. 슬프고 우울한 일도 있었지만, 내가 꾸준히 노력한 것은 결과나 상으로 그 빛을 발했다. 고등학교 1학년 시기를 한국디지털미디어고등학교에서 지냈을 때는 학교에 찌들어져 있고 잘 표현하지는 않지만 짜증내고 불만이 많았었던것 같다. 항상 집에 오면 학교에 대한 불편한 점부터 시작해서 억울한 일이 있을 때마다 부모님에게만 나의 이야기를 꺼냈다. 그래서 꼭 집..

My Story 2020.01.01

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

HackCTF Basic_BOF #1 Write-up

HackCTF의 Pwnable 첫 번째 문제 Basic_BOF #1 문제를 풀어보겠다. 우선 binary가 주어져 있으므로 IDA로 까 보도록 하겠다. main을 디컴파일한 결과를 보기 위해 F5번을 누르면 이런 창이 뜬다. 코드를 보면, 정체불명의 v5값이 주어져 있고 비교를 하여 쉘을 딸 수 있는 기회를 제공한다. if문에 있는 규칙도 안보이는 저 세 숫자는 뭘 뜻하는 걸까? IDA에서는 숫자를 char나 hex, 8진수 체계로 변환할 수 있다. 저 숫자를 클릭하고 'H'키를 누르면...! 뭔가 의도적으로 넣은 듯한 글자가 보이기 시작한다!! 결론은, 우리는 Stack Buffer Overflow를 일으켜 v5의 값을 변화시켜야 한다. 실행하고 난 후 stack을 까 보도록 하자. 그런데, gdb를 ..

Hacking/HackCTF 2019.12.22