728x90



임시파일의 내용을 확인해 보고 싶어진다. 확인해 보자.



/usr/bin/level5를 실행 한 뒤 /tmp/level5.tmp를 확인해 보니 그런 파일이 없다고 뜬다.


아마도 잠시동안만 생성된 뒤 삭제되는 프로그램인 것 같다.



그래서 위와 같은 간단한 코드를 이용해서 level5.tmp를 확인하도록 하자.


컴파일 후 실행하면 끝.

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level7  (0) 2015.09.17
[ftz] level6  (0) 2015.09.17
[ftz] level4  (0) 2015.09.17
[ftz] level3  (0) 2015.09.16
[ftz] level2  (0) 2015.09.16
728x90



힌트를 확인한 뒤 해당 디렉토리를 확인하였다.


친절하게 backdoor라는 파일이 있었고


파일 내용을 확인해 보니 finger 명령에 대한 configuration이 있었다.


찾아보니 server 탭에 적힌 디렉토리는 finger명령 실행 시 실행되는 것 같다. 해서


해당 디렉토리의 파일을 실행 해 보았다.



보다시피 my-pass명령이 실행되는 것 같다. 

이제 finger명령을 사용하면 level5의 권한으로 my-pass가 실행 될 것이다.



728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level6  (0) 2015.09.17
[ftz] level5  (0) 2015.09.17
[ftz] level3  (0) 2015.09.16
[ftz] level2  (0) 2015.09.16
[ftz] level1  (0) 2015.09.16
728x90



hint 를 확인 해 보면 간단히 명령인자 1개 받아서 "cmd"라는 문자배열에 붙여서 실행시키는 코드이다.


먼저 "cmd"에 복사되는 dig의 경우 nslookup과 비슷한 역할을 하는 프로그램이다.


more hints를 보면


동시에 여러 명령어를 사용하려면?

; (세미콜론)으로 명령어 사이를 묶어준다.

문자열 형태로 명령어를 전달하려면?

    "" (큰따옴표)로 묶는다.



모든 정보는 모였으니 autodig 파일을 찾는다.



setuid가 걸려 있으므로 이렇게 입력 하면 끝.

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level6  (0) 2015.09.17
[ftz] level5  (0) 2015.09.17
[ftz] level4  (0) 2015.09.17
[ftz] level2  (0) 2015.09.16
[ftz] level1  (0) 2015.09.16
728x90




hint를 확인해 보니 저런 메시지를 확인 할 수 있다.


일단 아무런 단서가 없으니 level3의 권한으로 setuid가 걸린 파일 검색해 보니 하나가 나온다.


실행 해보면 linux의 대표 텍스트 에디터인 vim이 나온다.


http://web.physics.ucsb.edu/~pcs/apps/editors/vi/vi_unix.html


위 사이트를 보면 명령모드에서 !뒤에 명령어를 실행시킬 수 있다.


위와 같이 실행시키면 level3의 암호 획득.

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level6  (0) 2015.09.17
[ftz] level5  (0) 2015.09.17
[ftz] level4  (0) 2015.09.17
[ftz] level3  (0) 2015.09.16
[ftz] level1  (0) 2015.09.16
728x90


putty 로 접속.



그리고 level1/level1 으로 로그인을 한다.


               

hint를 확인하니 level2 권한에 setuid가 걸린 것을 찾으라고 한다.


명령어 입력



find 명령어를 이용해서 level2 권한의 파일을 찾았다.


[여기서 잠깐!]

find 명령 뒤에 보면 2>/dev/null 이 볼 수 있는데

"2(표준 에러)" 스트림의 방향을 모니터가 아닌 /dev/null 로 보내므로써 "표준 에러"가 출력이 되지 않는다.

linux의 경우 window와 달리 표준에러와 표준 출력이 분리되어있다.

1>/dev/null 의 경우 "표준 출력"을 버리게 된다.


숫자의 의미는 linux가 예약한 file descriptor로

0 : 표준 입력

1 : 표준 출력

2 : 표준 에러



파일 이름대로 실행해 보니 램프의 요정처럼 명령어 하나를 level2의 권한으로 실행시켜준다는 메시지가 나온다.

쉘을 얻으면 장땡이므로 bash를 실행하여 my-pass를 하면 끝.

728x90

'ctf + wargame > 해커스쿨ftz' 카테고리의 다른 글

[ftz] level6  (0) 2015.09.17
[ftz] level5  (0) 2015.09.17
[ftz] level4  (0) 2015.09.17
[ftz] level3  (0) 2015.09.16
[ftz] level2  (0) 2015.09.16
728x90

Daddy told me about cool MD5 hash collision today.

I wanna do something like that too!


ssh col@pwnable.kr -p2222 (pw:guest)


--------------------------------------------------------------------------------------------------

접속



20바이트의 프로그램 파라미터를


check_password() 함수의 파라미터로 넘기고


check_password() 함수의 리턴값이 hashcode값과 같을 때 풀리는 문제이다.



check_password() 함수 내용을 보면


20바이트 문자열을 int형 포인터로 캐스팅하여 정수값으로 res에 더한다.


res값이 0x21DD09EC 값과 같게 해야 한다.


4바이트씩 총 20바이트 즉 5번을 더하므로 5로 나눈다.



0x21DD09EC - 0x6C5CEC8 * 5 = 4이므로


마지막 4바이트는 0x6C5CEC8 보다 4가 큰 0x6C5CECC를 입력한다.



 

python을 이용해서 값을 주었다.


리틀엔디안( Little Endian ) 이기 때문에 각 4바이트를 뒤집어서 입력해주어야 한다.

728x90

'ctf + wargame > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] - fd  (0) 2015.07.12
728x90

Mommy! what is a file descriptor in Linux?


ssh fd@pwnable.kr -p2222 (pw:guest)


--------------------------------------------------------------------------------------------------

접속 해 보자.



소스 파일을 열어보자



위 소스를 보면


메인함수의 매개변수를 정수로 변환하여 { atoi() - 아스키값을 정수로 }


0x1234를 뺀값을 파일디스크립터로 취하여 buf에 값을 읽어드린다.


그리고 "LETMEWIN\n"와 문자열을 비교하여 flag파일 내용을 출력한다.



- 파일 디스크립터(File Descriptor) : 시스템이 할당하여 준 파일이나 소켓을 대표하는 정수

   이 정수를 이용하여 파일에 접근하거나 제어할 수 있다. (윈도우에서의 HANDLE과 같다.)


항상 미리 예약되어 있는 값이 있는데

      ㄴ  표준 입력 : 0

          표준 출력 : 1

          표준 에러 출력 : 2

이다. 



해서 위 fd값을 표준 입력의 fd인 0으로 값을 주면 buf에 원하는 값을 넣을 수 있다.


0x1234는 십진수로 4660이므로




성공.

728x90

'ctf + wargame > pwnable.kr' 카테고리의 다른 글

[pwnable.kr] - collision  (0) 2015.07.12
728x90

올리로 열어 봅시다.




문자열이나 찾아 봅시다.




축하한다니.. 굉장히 수상하니 가 봅시다.




역시나 성공의 메시지박스를 띄우는 문자열이었습니다. 나란히 실패 메시지도 있습니다.

그리고 아마도 빨간네모로 표시한 부분이 마지막 분기점인 것 같습니다.

혹시 모르니 breakpoint를 걸어 둡시다.


위로 조금 올라가면




getDlgItemTextA함수를 호출하는 부분이 있습니다.


우리가 입력한 값을 읽기 위한 함수 일 것입니다. 역시 breakpoint 를 걸어두고 이제 실행하여


갑을 입력합시다.




저는 CrackMe라는 문자열을 입력하였습니다. 그리고 확인!



break를 걸어두었던 GetDlgItemText로 왔습니다.


근데 현재 비교문에서 헥사값61과 다르면  진행해보시면 알겠지만 종료가 됩니다.


밑에 확인해 보니



'r'입니다. 우리가 입력한 CrackMe의 두번째 바이트인 것을 알 수 있습니다. 따라서


일단 두번쨰 바이트는 헥사값61 즉 'a'라는 것을 알았습니다. 바꿔서 진행합시다.




이번에 "CarckMe"로 진해해 보면 앞선 비교문에서는 정상 진행하는 것을 볼 수 있습니다.




ECX레지스터의 위치에 입력한 값이 3번째 바이트 부터 있는 것이 보이며


밑에 00401135(실패 메시지)로 가는 분기가 있는 것을 보니


00401150 안에서 뭔가 있을 것 같습니다. follow 합시다.




쭉 보니 아까 위에서 push한 "5y"와 3,4번째 바이트를 비교하고 있습니다.


우리는 EAX를 0으로 만들어야 하므로(401150호출후 분기 TEST EAX,EAX)


입력을 다시 해 보겠습니다.






3, 4번째를 "5y"로 바꾸어 입력해서 넘어왔지만 새로운 난관이 있습니다.


이번에는 5번째바이트 부터 저기 "R3versing"이랑 비교를 합니다. 이 하 과정 생략하고


다시 입력하면




마지막 난관 처음에 break 걸어두었던 마지막 분기점으로 왔습니다. 이번에는

첫 바이트를 비교하고 있습니다. 이제 첫 바이트만 변경하면 올바른 값이 출력 될 것입니다.




요렇게!!  (답은 가려주는 센스)

728x90

'ctf + wargame > reversing.kr' 카테고리의 다른 글

Easy Keygen  (0) 2015.11.27
728x90

Challenges : Basic 12


Author : Basse 2002


Korean : 
Key를 구한 후 입력하게 되면 성공메시지를 볼 수 있다 
이때 성공메시지 대신 Key 값이 MessageBox에 출력 되도록 하려면 파일을 HexEdit로 오픈 한 다음 
0x???? ~ 0x???? 영역에 Key 값을 overwrite 하면 된다. 

문제 : Key값과 + 주소영역을 찾으시오 
Ex) 7777777???????? 


English : 
You will see a success message after finding the key. 
If you would want the Key itself to replace the success message in the MessageBox, 
open up a Hex Editor and overwrite the key value in the offset range 0x???? ~ 0x????. 

Q : find the key value and the offset range and write the solution in this format : key???????? 
(first ???? for the start and the next 4 ?s for the end). 

-----------------------------------------------------------------------------------------------


심플 합니다. 심플한 키젠입니다. PEiD로 확인해 보시면 알겠지만

패킹도 안되어 있습니다. 사정없이 디버거로 벗겨(?) 봅시다.




이것 저것 breakpoint를 걸어보며 살펴보았지만 제가 적은 문자열은 어디에서도 찾아볼 

수 없었습니다. 그래서 함수기능을 찾아보던중 위 화면에 "GetDlgItemInt"라는 함수가

텍스트를 정수형으로 변환하는 함수라는 것을 알게되었습니다. 그래서 저 함수에 break를

걸고 실행해 보았습니다.


입력후 Check 버튼을 누르면


함수 호출후...


반환값이 저장되는 EAX의 레지스터 값이 200

즉 10진수로 512가 저장되는 것을 확인했습니다.


그리고 밑에보니 올바른 키값일 경우의 메시지박스로 가는 분기점을 찾았고

저 분기점에서의 EAX레지스터 값을 확인해보니


그대로 였습니다. 결국 키값은 분기점에서 EAX와 비교하는 저 값인 것을 알게되었습니다.

저 값을 10진수로 변환하면 되겠죠?


그리고 문제대로 성공메시지박스의 내용을 수정합시다. (원래는 키값으로 수정)


끝!

728x90
728x90

Challenges : Basic 10


Author : ArturDents


Korean 
OEP를 구한 후 "등록성공"으로 가는 분기점의 OPCODE를 구하시오. 정답인증은 OEP + OPCODE 
EX) 00400000EB03 

English 
After finding the OEP, find the OPCODE of the branch instruction going to the "goodboy routine" 
The solution should be in this format : OEP + Serial 
EX) 00400000EB03 

-----------------------------------------------------------------------------------------------

실행해 보니 PUSHAD로 시작합니다. PEiD로 확인을 해보면



역시나 패킹이 되어있지만 이번에는 UPX가 아닌 ASPack이란 방식으로 되어있네요.

패킹 방법을 찾아보니 UPX와 크게 다르지 않습니다.



그림과 같이 1줄 진행하여 레지스터들을 스택에 넣은후

ESP에 커서를 놓고 오른쪽버튼 - Follow in Dump 를 눌러 덤프를 뜹니다.



그리고 덤프에서(왼쪽 아래창) break point 를 걸어줍니다.

이렇게 하는 이유는 PUSHAD를 했으면 언젠가 POPAD를 할 텐데

그 지점을 찾기가 힘드니까 이런식으로 break point를 거는 것 입니다.


그리고 진행을 하면 


원하는 곳으로 오게 되었습니다. 진행하여 OEP로 갑시다.



뭔가 휑 하고 이상하지만 참고 덤프를 뜨고 LordPE로 rebuild를 해줍시다.



Unpacking이 잘 되었습니다. 옵코드를 보니 덤프뜨기전 OEP의 값들과 같습니다.


all referenced text strings을 보니 Registered well done! 이라는 부분이 있습니다.

더블클릭 해서 위에 있는 분기점의 옵코드를 확인합시다. 그럼 끝!

728x90

+ Recent posts