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

Hacker msg?? / 해커가 남긴 메시지

hacker_message.pcap

해커가 Telnet 을 이용하여 ubuntu 데스크탑에 접근 한 후 
메시지를 남겼습니다. 

패킷내용을 분석하여 어떤 내용을 남겨뒀는지 찾아보세요.


 Wireshark 를 이용하여 telnet을 기준으로 패킷을 필터링한다.


이후 Follow TCP STREAM 기능을 이용하여 송 수신된 데이터를 확인한다.


 




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

Programming - Lotto Number  (0) 2017.04.20
Packet Analyze - Find EXE File  (0) 2017.04.20
Reversing - Fine KEY1  (0) 2017.04.20
Programming - Average  (0) 2017.04.20
Programming - Fibonacci +  (0) 2017.04.20

Find KEY1 / KEY를 찾아내세요

reversing_findkey1.exe

첨부한 실행파일을 내려받아 키를 찾아내고
플래그를 등록하세요


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




v4 값과 87을 XOR 연산하여 1320553664 라는 값이 나오면 flag를 출력한다.


그렇다면 1320553664와 87을 xor 하면  플래그가 나올 것이다.


1320553664 ^ 87 = 1320553623


flag : 1320553623



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

Packet Analyze - Find EXE File  (0) 2017.04.20
Packet Analyze - hacker msg??  (0) 2017.04.20
Programming - Average  (0) 2017.04.20
Programming - Fibonacci +  (0) 2017.04.20
Programming - Text Numbers  (0) 2017.04.20

Average / 평균계산기의 오류

average.exe

첨부된 실행파일은 사용자가 입력한 정수만큼 "평균"을 계산하여 출력해주는 
프로그램 입니다. 

이 프로그램은 프로그래머가 자주 실수하는 심각한 문제가 있는데,
이 문제점을 찾아 평균점수가 0점이 출력될 수 있도록 값을 입력하세요.

평균 0점이 되면 플래그가 출력됩니다.


풀이


IDA로 해당 파일을 열어 확인한다.





scanf 함수로 입력받을 정수의 갯수를 입력받는데 입력받을 정수의 범위를 지정하고 있지 않다.


따라서 -1 을 집어넣게 되면 평균값이 0이 출력되므로 플래그가 나오게 된다.





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

Packet Analyze - hacker msg??  (0) 2017.04.20
Reversing - Fine KEY1  (0) 2017.04.20
Programming - Fibonacci +  (0) 2017.04.20
Programming - Text Numbers  (0) 2017.04.20
Programming - Count of 5  (0) 2017.04.20

+ Recent posts