zj3t

email: euntaejang@gmail.com

Latest Posts
파일 디스크립터에 대한 문제였습니다.





open함수의 리턴값은 파일 디스크립터라 해서 0,1,2 중 하나가 들어갈 것이라 생각했습니다. 그후 char pw_buf[]에는 초기화가 되어있지 않아 쓰레기 값이 들어있으며 그렇다면 표준입력을 이용해 내가 값을 써주어야 한다고생각했습니다. 



성공입니다. sleep이 낚시였습니다. 저도 낚였었습니다....
이 문제는....모르는 개념이 있어서 찾아보면서 했습니다. 어셈블리를 읽을 줄 아는데 처음보는 레지스터들이 많이나와서 어려웠던 문제 였습니다.



함수의 리턴 값은 r0에 저장된답니다.
pc는 다다음 실행될 명령??을 가리킨다고 해요. 다음 실행될 명령, 다다음 실행될 명령 말이 많은데 다다음 으로 했을 때 정답이 됬습니다.

<key1>
   0x00008cdc <+8>: mov r3, pc
   0x00008ce0 <+12>: mov r0, r3


즉 r3는 8ce0+4=8ce4

<key2>

   0x00008d04 <+20>: mov r3, pc
   0x00008d06 <+22>: adds r3, #4
   0x00008d08 <+24>: push {r3}
   0x00008d0a <+26>: pop {pc}
   0x00008d0c <+28>: pop {r6}  ; (ldr r6, [sp], #4)
   0x00008d10 <+32>: mov r0, r3

즉 r3은 다음에 실행될 명령이 담긴+4인 8d08와 +4=8d0c

<main>
 0x00008d7c <+64>: bl 0x8d20 <key3>

<key3>
   0x00008d28 <+8>: mov r3, lr
   0x00008d2c <+12>: mov r0, r3

bl명령어 등으로 점프했을 때 다시 돌아와서 실행 할 주소를 가리키는 것이 lr이라고 합니다.

즉 8d80이 됩니다.


8ce4+8d0c+8d80=답




passcode 풀다가 어려워서 잠깐 넘어와 random문제를 풀어봤습니다.


pwnable은 파일생성에 허가거부가 들어있어서 제 우분투로 코드를 옴겨와 실행했습니다.


random 값을 알아보기위해 함수를 추가!!



간단히 파이썬으로 정수값을 출력


성공!!!


쉬운문제였습니다.

알고보면 쉬운문제 였는데. 처음보는 사람은 해매게 되는 문제인 것 같습니다. 저도 코드엔진문제를 풀때 elf파일을 처음 봤는데 이를 ida에서 분석했었습니다. 하지만 이번엔 x86 64bit라 설치된 ida에서 분석도 안되서 구글에 gdb elf x86 64 를 검색해도 마땅히 나오지 않고.....그래서 포기하려던 중 헥스에디터로나 열어보자 해서 풀게되었습니다.






elf 64파일임을 알려줍니다.


upx 패킹되어있습니다. 딱봐도 저 UPX 문자열과 밑에 암호화 된것같은 문자열들...그럼 거의 99% upx 언패킹을 해주어야합니다.


그 후 문자열 검색으로 flag 부분을 찾아 인증 했더니 성공했습니다.

랜섬웨어 디펜더 컨퍼런스에 다녀왔습니다.



사전 신청을 받아서 신청하고 다녀왔습니다.



후기:

컨퍼런스이라길래 랜섬웨어에 대해 분석하고 어떤 원리 인지 설명해 주는 줄 알고 기대하며 갔는데 그냥 단순한 기업의 제품설명?? 이였습니다. '랜섬웨어에 대항할 수 있는 것은 우리의 프로그램이다' 이런식으로만 한 5개의 기업정도가 두시간 가까이 설명했던 것 같습니다. 처음에 사람이 많았는데 하나 둘씩 나가더군요.....다른 분들은 어떠실지 모르겠지만 저는 조금 별로인 컨퍼런스 였습니다. 나가고 싶었지만 이왕온김에 경품이나 타가자 마음먹고 끝까지 들었는데 또 경품 추첨에 응모하려면 명함이 있어야 했습니다.........미리 말좀 해주시지 학생들도 많은데;; 

그래도 컨퍼런스 다녀온 사람은 발자국이라는 백업 프로그램 무료로 줘서 받았습니다.

경험삼아 한번 가보는 것도 괜찮을 것 같아요.

가상머신에 깔린 내 우분투로 접속하여 다운로드 받았다.


문제의 소스코드이다.


다운받은 bof파일로 gdb해서 디스어셈블 해봤는데 call부분에 함수 같은 정보가 나오지 않아서 bof.c파일을 복사해 bof1.c파일로 컴파일한 bof1로 gdb로 열었더니 함수 정보가 잘 나왔다.

여기서 int key라는 매개변수와 char overflow[32] 사이의 거리를 알아내는 것이 이 문제의 핵심이다. 

어셈블리코드를 보면 ebp-0x2c(44)에서 get으로 입력을 받는 것을 보고 overflow변수의 위치라 생각했고 cafebabe를 비교하는 부분에서 ebp+0x08이랑 비교하는 것을 보고 이 부분이 key변수의 위치라 생각했다. 즉 두 변수의 거리차는 52였다.(리버싱 공부한걸 여따 써먹네요)


성공입니다. 권한을 얻은 것을 볼 수 있습니다.





char은 1byte, int는 4byte입니다. 
aaaabbbbccccddddeeee를 아규먼트로 주고 실행하면 ip[0]=aaaa로 61616161이 되고
ip[1]=bbbb로 62626262가 되는식으로 코드가 진행됩니다.

따라서 아규먼트 20byte를 4byte씩 hex값으로 5번 더한 것이 저 hashcode의 변수 값이 되어야 합니다. 

hash collision은 인터넷에 겁색해보면 자세히 나옵니다. 간단히 말하면 hash값이 같은 또 다른 수 가있으면 hash collision이라 합니다.

문제에 md5가 있길래 저 hashcode값을 문자열로 바꿔 md5 해시값을 얻은 값과 같은 문자열을 찾아야 하는줄 알고 엄청 시간을 써서 암호화하고 별짓을 다하다 쉽게 생각하기로 하고 5번을 더하니 5로 나누었고 나머지가 4가 생기더군요, 즉 hashcode= x+x+x+x+x+4였습니다. x는 직접 구해보세요(계산기 실행시키면 나와요) 그래서 그 값을 hex로 바꾸어 인자로 넣어주었습니다.


왜 20개를 너었는데 안되지 하고 한시간을 고민했는데 /c 로 맨 마지막을 썻더군요. 결국 찾아서 인증했더니 답이였습니다.



이 문제는 답이 많은 문제라고 생각합니다. 저랑 다르게 인자를 넣어 성공한 분들도 많았습니다.
안녕하세요.
요새는 악성코드 공부와 함께 해킹방어대회 문제들을 한번씩 훑고있습니다.
무엇을 공부하겠다 해도 다른게 재밌어 보이면 바로 다른걸 공부하게 되네요....

해킹방어대회를 풀다가 web과 pwnable쪽이 너무 취약해서 더 공부해보려고 풀어봤습니다.
web은 저랑 잘 안맞는거 같아요. SQL Injection도 어렵고.. 천천히 공부해보겠습니다.

일단 가장 쉬운 fd 문제입니다.


자!! 첫 문제 화면입니다. 아마 여기서 파일 디스크립터를 언급했으므로 그에 대한 문제라 추측해 볼 수 있었습니다.


리눅스 파일 디스크립터에 관한 내용입니다. 이를 이용해야 문제를 풀 수 있습니다.


read(파일 디스크립터, 값을 읽을 버퍼, 값을 읽을 버퍼의 size) 입니다. 버퍼에서 읽어와하는데 버퍼에 값을 할당하도록하는 코드들이 위에 없는 것을 확인 할 수 있었습니다. 따라서 파일 디스크 립터를 이용해 fd를 0, 즉 표준 입력을 받도록 설정해 주어야합니다. 


0x1234는 4660이고 이를 인자로 줬더니 fd가 0이되여 표준 입력 상태가 됩니다. 따라서 값을 입력해 주면 됩니다.