no image
Basic RCE L10
이번에는 OEP와 등록성공으로 가는 OPCODE를 구하라고합니다! PUSHAD를 보아하니 패킹이 되어있군요 :D 한번 확인해봅시다! 이번에는 ASPacking이 되어있습니다! UPX가 아니군요..! 일단 전 문제 풀이에서 공부했던 방식으로 OEP를 찾아가도록 하겠습니다 :D OEP를 찾아왔습니다! 그런데 아무런게 보이지 않는군요? [Ctrl] + [A] 를 누르면 본래 코드들을 볼 수 있습니다 :D 그럼 쉬운방법으로 찾기 위해 문자열로 찾아봅시다 :D 문자열을 검색하니 Registered가 보입니다! 더블클릭으로 들어가 봅시다 :D 조금더 위에 보니 JNZ 분기가 보이네요 ! 저 분기에 따라 Registerd 문자열이 출력이 되는것을 보아 "등록성공" 으로가는 분기임을 알 수 있습니다! 이만 Basic ..
2020.02.23
no image
Basic RCE L09
StorlenByte를 구하라고 하네요 :D 일단 열어봅시다! 또 PUSHAD가 나왔습니다! 패킹이 되어있다는 소리겠죠 ㅎㅎㅎ? 이번에는 한번에 POPAD로 가는 방법을 알려드리겠습니다! PUSHAD를 실행시키면 8개의 레지스터가 스택에 쌓인다고 했죠 :D 쌓인 순간의 스택의 위치를 메모리 주소로 찾아갑니다! 그럼 ESP의 위치는 19FF54이므로 메모리도 19FF54로 Go To([Ctrl]+[G]) 해주도록 합시다 :D 그다음 첫번째 바이트에 브레이크 보인트를 걸어줍니다! 그리고 [F9]를 눌러 실행을 시켜주면 바로 POPAD 밑으로 갑니다! 이렇게 말이죠 :D 그런데 PUSH 명령어가 3개가 존재하는 걸 볼 수 있습니다! StolenByte의 의미를 알아야 하는데요 ! 패커가 임의로 이동 시킨 코드..
2020.02.15
no image
Cryptography - Classic Cipher-2
문제로 가보니 힌트가 존재합니다! 힌트는 키가 숫자라네요!? 일단 파일을 열어봅시다! 암호화된 문자열이 존재합니다! 그리고 키는 "python"이라는군요? 저는 한참을 고민했습니다.. 전치암호인가.. 치환암호인가.. 오만가지 다보다가! python과 숫자.. 알파벳의 순서를 나타내보자 했죠! 알파벳 순서를 보니 이렇게 나옵니다! 그럼 암호문도 숫자만큼 나누어봅시다! 다행히 6글자로 딱 나눠떨어지는군요! 그리고 하나로 합쳐봤는데.. 답이었습니다 :D 이렇게 Classic Cipher-2 문제풀이를 마치겠습니다 :D
2020.02.14
no image
Old - 26 (score:100)
덩그러니 소스코드게 있네요! 소스코드를 보아하니.. id라는 인자값에 "admin"이면 "no!" 출력하고 url 디코딩했을 때 admin이면 문제 풀이 성공이랍니다! admin을 넣어주니 역시는 역시나죠 :D 그럼 간단한거 아닌가요?! url 인코딩한 값을 넣어주면 되겠죠! (google에 "url 인코딩 표"를 검색하면 무수히 많이 나옵니다 ~_~) 자 이렇게 완료해서 넣어주도록 합시다! 엥!? no!!? 왜지.. 하는 순간 url을 보니까 admin으로 디코딩 되어 있음을 보았습니다! 그래서 알아본 결과.. 웹 서버와 브라우저 사이에서 데이터 교환할 때 브라우저 폼에서 입력받은 데이터를 인코딩한 값으로 php서버에 보내고 php는 받은 것을 디코딩한다네요! 그럼 인코딩한 값을 한번 더 인코딩하면 풀..
2020.02.14
no image
Basic RCE L08
OEP를 구하라고 하네요 :D 일단 Ollydbg로 올려봅시다! 올려보니 PUSHAD가 존재합니다! 패킹이 되어 있다는 소리인데.. 이번에는 패킹을 디버깅으로 풀어보도록 하겠습니다 :D 먼저 PUSHAD는 무엇이냐! 8개의 레지스터를 스택에 쌓아줍니다! (EAX -> ECX -> EDX -> EBX -> ESP -> EBP -> ESI -> EDI) 그리고 PUSHAD가 존재하면 마지막엔 반드시 POPAD가 존재한다는거 있지마세요 :D 자 위의 레지스터를 잘 주목해보세요! 지금 보이시나요? 레지스터가 들고 있던 값들이 전부 스택에 쌓아졌습니다! 1020C41 주소에서 ESI에 들어가는 주소인 101A000을 보면 Packing된 내용들이 들어가 있습니다! 1020C4C에 보면 EDI값을 스택에 쌓는데 보..
2020.02.14
no image
Cryptography - Classic Cipher-1
문제를 보니 Hint가 있습니다! Hint가 [::-1]이라고 나와있는데 저는 한참 고민했습니다..ㅠ_ㅠ 그래서 알아보던 중 [::-1]이 Python에서 문자를 역순 시켜 주는 것이더라구요! 역순을 시킨 뒤 가장 많이 쓰이는 카이사르(시저) 암호 복호화를 시도해보았습니다 :D C언어로 짠 코드입니다! 19번째에 떡하니 flag가 보이는군요! 지금까지 Classic Cipher-1 문제 풀이였습니다 :D
2020.02.13
no image
Old - 24 (score:100)
문제를 들어가보니 client ip와 agent 정보가 출력이 됩니다 ! 소스를 볼 수 있으니 소스를 확인해보도록 합시다 :D 소스코드를 확인해보니 ip부분에 필터링이 걸려있고 ip가 127.0.0.1이면 풀린다고하네요 :D 그래서 저는 어떻게 ip값을 바꿀까 생각하다가 쿠키값을 이용해서 바꿨습니다! 필터링이 걸려있기 때문에 우회를 하기 위해 다음과 같은 방법을 사용했습니다! 중간중간에 필터링되는 값을 넣어 127.0.0.1을 나타낼 수 있게 만든 것입니다 :D 쿠키값을 넣고 다시 새로고침해주면 이렇게 문제가 풀립니다! 이상 24번 문제 풀이였습니다 :D
2020.02.13
no image
Basic RCE L07
문제를 보니 "CodeEngn은 어떤것으로 변경되는가?" 입니다. 조건이 컴퓨터 C 드라이브의 이름이 CodeEngn일 경우라네요! 그럼 일단 C드라이브의 이름을 바꿔줍시다! (저는 처음에 C드라이브 이름 안바꾸고 했다가 한참 애먹었습니다..ㅠㅠ) 자 변경을 시키고 Ollydbg로 열어줍니다 :D EP입니다! 처음부터 GetModuleHandleA함수를 통해 어떤 모듈의 정보를 가져오는군요 :D https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandlea GetModuleHandleA function (libloaderapi.h) - Win32 apps Retrieves a module han..
2020.02.13

Basic RCE L10

HelloMG
|2020. 2. 23. 15:43

Basic RCE L10 문제

이번에는 OEP와 등록성공으로 가는 OPCODE를 구하라고합니다!

PUSHAD

PUSHAD를 보아하니 패킹이 되어있군요 :D

한번 확인해봅시다!

ASPack

이번에는 ASPacking이 되어있습니다!

UPX가 아니군요..!

 

일단 전 문제 풀이에서 공부했던 방식으로 OEP를 찾아가도록 하겠습니다 :D

OEP

OEP를 찾아왔습니다!

그런데 아무런게 보이지 않는군요?

[Ctrl] + [A] 를 누르면 본래 코드들을 볼 수 있습니다 :D

[Ctrl] + [A]

그럼 쉬운방법으로 찾기 위해 문자열로 찾아봅시다 :D

문자열 검색

문자열을 검색하니 Registered가 보입니다!

 

더블클릭으로 들어가 봅시다 :D

JNZ 분기

조금더 위에 보니 JNZ 분기가 보이네요 !

 

저 분기에 따라 Registerd 문자열이 출력이 되는것을 보아 "등록성공" 으로가는 분기임을 알 수 있습니다!

 

이만 Basic RCE L10 문제풀이를 마치겠습니다 :D

'CTF > CodeEngn.kr' 카테고리의 다른 글

Basic RCE L12  (0) 2020.02.28
Basic RCE L11  (0) 2020.02.24
Basic RCE L09  (0) 2020.02.15
Basic RCE L08  (0) 2020.02.14
Basic RCE L07  (0) 2020.02.13

Basic RCE L09

HelloMG
|2020. 2. 15. 17:22

Basic RCE L09 문제

StorlenByte를 구하라고 하네요 :D

 

일단 열어봅시다!

PUSHAD

또 PUSHAD가 나왔습니다!

패킹이 되어있다는 소리겠죠 ㅎㅎㅎ?

 

이번에는 한번에 POPAD로 가는 방법을 알려드리겠습니다!

Go to

PUSHAD를 실행시키면 8개의 레지스터가 스택에 쌓인다고 했죠 :D

쌓인 순간의 스택의 위치를 메모리 주소로 찾아갑니다!

그럼 ESP의 위치는 19FF54이므로 메모리도 19FF54로 Go To([Ctrl]+[G]) 해주도록 합시다 :D

Hardware BP

그다음 첫번째 바이트에 브레이크 보인트를 걸어줍니다!

 

그리고 [F9]를 눌러 실행을 시켜주면 바로 POPAD 밑으로 갑니다!

POPAD

이렇게 말이죠 :D

그런데 PUSH 명령어가 3개가 존재하는 걸 볼 수 있습니다!

 

StolenByte의 의미를 알아야 하는데요 !

패커가 임의로 이동 시킨 코드의 윗부분을 의미를 합니다 :D

이러한 경우 정상실행이 되지 않기 때문에 제 위치에 놓은 뒤 덤프를 시켜 정상 실행을 시켜줘야 하죠!

 

덤프하는 방법은 다른 사이트에도 많이 나와있으니 한번 꼭 해보시길 바랍니다 !

* 많은 공부가 되실꺼예요 ㅎㅎㅎ *

 

그럼 저 3개의 PUSH 명령어가 StolenByte면 OEP로 돌아갔을 때 정상적인 모습이 나오지 않겠죠 :D ?

OEP

OEP로 돌아가보니 정상적이지 않은 것을 보아 StolenByte임을 알 수 있습니다!

 

그러므로 정답은 "6A0068002040006812204000"이 되겠네요 ㅎㅎㅎㅎ

 

이만 9번 문제 풀이를 마치겠습니다 :D

'CTF > CodeEngn.kr' 카테고리의 다른 글

Basic RCE L11  (0) 2020.02.24
Basic RCE L10  (0) 2020.02.23
Basic RCE L08  (0) 2020.02.14
Basic RCE L07  (0) 2020.02.13
Basic RCE L06  (0) 2020.02.12

Classic Cipher-2 Hint

문제로 가보니 힌트가 존재합니다!

힌트는 키가 숫자라네요!?

 

일단 파일을 열어봅시다!

ciphertext

암호화된 문자열이 존재합니다!

그리고 키는 "python"이라는군요?

 

저는 한참을 고민했습니다..

전치암호인가.. 치환암호인가.. 오만가지 다보다가!

 

python과 숫자.. 알파벳의 순서를 나타내보자 했죠!

python 알파벳 순서

알파벳 순서를 보니 이렇게 나옵니다!

그럼 암호문도 숫자만큼 나누어봅시다!

복호화

다행히 6글자로 딱 나눠떨어지는군요!

그리고 하나로 합쳐봤는데.. 답이었습니다 :D

복호화 성공

이렇게 Classic Cipher-2 문제풀이를 마치겠습니다 :D

'CTF > HackCTF' 카테고리의 다른 글

Reversing - Reversing Me  (0) 2020.02.24
Reversing - Welcome_REV  (0) 2020.02.24
Cryptography - Classic Cipher-1  (0) 2020.02.13
Cryptography - Smooth CipherText  (0) 2020.02.12
Cryptography - Great Binary  (0) 2020.02.10

 

Old 26번 문제

덩그러니 소스코드게 있네요!

소스코드

소스코드를 보아하니..

id라는 인자값에 "admin"이면 "no!" 출력하고

url 디코딩했을 때 admin이면 문제 풀이 성공이랍니다! 

admin 입력

admin을 넣어주니 역시는 역시나죠 :D

그럼 간단한거 아닌가요?!

url 인코딩한 값을 넣어주면 되겠죠!

(google에 "url 인코딩 표"를 검색하면 무수히 많이 나옵니다 ~_~)

admin url 인코딩

자 이렇게 완료해서 넣어주도록 합시다!

no!

엥!? no!!?

왜지.. 하는 순간 url을 보니까 admin으로 디코딩 되어 있음을 보았습니다!

그래서 알아본 결과..

 

웹 서버와 브라우저 사이에서 데이터 교환할 때 브라우저 폼에서 입력받은 데이터를

인코딩한 값으로 php서버에 보내고 php는 받은 것을 디코딩한다네요!

 

그럼 인코딩한 값을 한번 더 인코딩하면 풀리지 않을까요 :D?

밑의 홈페이지를 이용해서 url 인코딩을 진행해 봅시다!

https://www.url-encode-decode.com/

 

URL Encode Decode - URL Percent Encoding and Decoding.

Join to access discussion forums and premium features of the site.

www.url-encode-decode.com

인코딩

자 인코딩하면 오른쪽과 같은 값이 나옵니다!

이제 넣어보도록 합시다 :D

풀이 성공

문제가 풀렸죠 ㅎㅎㅎ?!

 

그럼 26번 문제 풀이를 마치도록하겠습니다 :D

'CTF > Webhacking.kr' 카테고리의 다른 글

Old - 39 (score:100)  (0) 2020.02.24
Old - 38 (score:100)  (0) 2020.02.23
Old - 24 (score:100)  (0) 2020.02.13
Old - 18 (score:100)  (0) 2020.02.12
Old - 17 (score:100)  (0) 2020.02.10

Basic RCE L08

HelloMG
|2020. 2. 14. 16:56

Basic RCE L08 문제

OEP를 구하라고 하네요 :D

 

일단 Ollydbg로 올려봅시다!

PUSHAD

올려보니 PUSHAD가 존재합니다! 패킹이 되어 있다는 소리인데..

이번에는 패킹을 디버깅으로 풀어보도록 하겠습니다 :D

 

먼저 PUSHAD는 무엇이냐!

8개의 레지스터를 스택에 쌓아줍니다!

(EAX -> ECX -> EDX -> EBX -> ESP -> EBP -> ESI -> EDI)

 

그리고 PUSHAD가 존재하면 마지막엔 반드시 POPAD가 존재한다는거 있지마세요 :D

레지스터

자 위의 레지스터를 잘 주목해보세요!

스택

지금 보이시나요?

레지스터가 들고 있던 값들이 전부 스택에 쌓아졌습니다!

ESI

1020C41 주소에서 ESI에 들어가는 주소인 101A000을 보면

Packing된 내용들이 들어가 있습니다!

EDI

1020C4C에 보면

EDI값을 스택에 쌓는데 보면 아무런 값이 없습니다 !

앞으로 이공간에 복호화된 값이 들어가게 될것입니다 ㅎㅎㅎ

 

자 그럼 트레이싱 기능을 이용해서 계속 분석해보도록 하다보면..

복호화된 값

이렇게 복호화된 값들이 들어가게 됩니다!

LoadLibraryA

그러다 LodaLibraryA를 통해서 Kernel32.dll을 로드합니다.

이것이 의미하는 바는 그 안에 존재하는 함수를 사용하겠다는 의미입니다.

그럼 한번 IAT를 살펴보도록 합시다!

IAT

IAT에 보니 API가 현저히 보족한거 보이실겁니다 !

즉, LodaLibraryA로 Kernel32.dll을 로드하는 이유는 GetProcAddress를 이용해서 복구하기 위해서였네요 :D

복구 루틴

이렇게 복구하는 루틴입니다!

EDI가 가지는 값을 한번 살펴볼까요 :D

EDI

보니 API의 이름을 확인할 수 있네요!

API 이름 목록을 인자로 받아 GetProcAddress를 호출하고 해당 인자를 EAX에 저장합니다.

101F008부터 EAX의 값을 저장하면서 Kernel32.dll의 IAT를 복구하고 다른 IAT도 모두 복구시킵니다!

복구된 IAT

이렇게 복구가 되면 VirtualProtect 함수를 만나게 되고 실행권한을 부여합니다!

VirtualProtect

그리고 처음에 말했듯이 PUSHAD가 존재하면 POPAD도 존재한다고 했었죠 ㅎㅎㅎ?

이렇게 POPAD를 만나면 Unpacking이 마무리된 단계입니다 :D

그리고 ESP 값을 원래대로 되돌려 줍니다!

ESP-80

그리고 JMP를 통해서 OEP로 가게됩니다!

OEP

그래서 정답은 1012475입니다 :D

 

사실상 UPX로 언패킹하면 쉽게할 수 있지만 한번쯤은 이렇게 알아보는것도 공부가 될거라 생각합니다!

여기서 꿀팁!

POPAD를 바로찾아가는 방법도 있습니다만..

또 다른문제에서 패킹문제가 존재한다면 그 방법을 통해서 분석하도록 하겠습니다!

 

그럼 8번 문제 풀이를 마치겠습니다 :D

'CTF > CodeEngn.kr' 카테고리의 다른 글

Basic RCE L10  (0) 2020.02.23
Basic RCE L09  (0) 2020.02.15
Basic RCE L07  (0) 2020.02.13
Basic RCE L06  (0) 2020.02.12
Basic RCE L05  (0) 2020.02.10

 

hint
Classic Cipher-1 문제

문제를 보니 Hint가 있습니다!

Hint가 [::-1]이라고 나와있는데 저는 한참 고민했습니다..ㅠ_ㅠ

그래서 알아보던 중 [::-1]이 Python에서 문자를 역순 시켜 주는 것이더라구요!

[::-1]

역순을 시킨 뒤 가장 많이 쓰이는 카이사르(시저) 암호 복호화를 시도해보았습니다 :D

소스코드

C언어로 짠 코드입니다!

카이사르 암호 복호화

19번째에 떡하니 flag가 보이는군요!

 

 지금까지 Classic Cipher-1 문제 풀이였습니다 :D

'CTF > HackCTF' 카테고리의 다른 글

Reversing - Welcome_REV  (0) 2020.02.24
Cryptography - Classic Cipher-2  (0) 2020.02.14
Cryptography - Smooth CipherText  (0) 2020.02.12
Cryptography - Great Binary  (0) 2020.02.10
Web - Cookie  (0) 2020.02.07

Old 24번 문제1

문제를 들어가보니 client ip와 agent 정보가 출력이 됩니다 !

소스를 볼 수 있으니 소스를 확인해보도록 합시다 :D

소스코드

소스코드를 확인해보니 ip부분에 필터링이 걸려있고

ip가 127.0.0.1이면 풀린다고하네요 :D

 

그래서 저는 어떻게 ip값을 바꿀까 생각하다가 쿠키값을 이용해서 바꿨습니다!

필터링이 걸려있기 때문에 우회를 하기 위해 다음과 같은 방법을 사용했습니다!

우회

중간중간에 필터링되는 값을 넣어 127.0.0.1을 나타낼 수 있게 만든 것입니다 :D

문제 풀이 성공

쿠키값을 넣고 다시 새로고침해주면 이렇게 문제가 풀립니다!

 

이상 24번 문제 풀이였습니다 :D

'CTF > Webhacking.kr' 카테고리의 다른 글

Old - 38 (score:100)  (0) 2020.02.23
Old - 26 (score:100)  (0) 2020.02.14
Old - 18 (score:100)  (0) 2020.02.12
Old - 17 (score:100)  (0) 2020.02.10
Old - 16 (score:100)  (0) 2020.02.09

Basic RCE L07

HelloMG
|2020. 2. 13. 19:03

Basic RCE L07 문제

문제를 보니 "CodeEngn은 어떤것으로 변경되는가?" 입니다.

조건이 컴퓨터 C 드라이브의 이름이 CodeEngn일 경우라네요!

 

그럼 일단 C드라이브의 이름을 바꿔줍시다!

(저는 처음에 C드라이브 이름 안바꾸고 했다가 한참 애먹었습니다..ㅠㅠ)

C 드라이브 이름 변경

자 변경을 시키고 Ollydbg로 열어줍니다 :D

EP

EP입니다!

처음부터 GetModuleHandleA함수를 통해 어떤 모듈의 정보를 가져오는군요 :D

https://docs.microsoft.com/en-us/windows/win32/api/libloaderapi/nf-libloaderapi-getmodulehandlea

 

GetModuleHandleA function (libloaderapi.h) - Win32 apps

Retrieves a module handle for the specified module. The module must have been loaded by the calling process.

docs.microsoft.com

그리고 DialogBoxParamA을 지나칠 때

다이얼로그박스가 실행이되는 것을 알 수 있습니다!

 

그리고 어떤값을 입력하라고 하는군요 :D

그래서 저는 좀 살펴보다가 밑에서 비교구문이랑 성공 및 실패 메시지박스 발견할 수 있었습니다!

비교구문

그럼 BP(BreakPoint)를 걸어주고 다이얼로그에

test라는 값을 입력해 주었습니다!

lstrcatA

그러자 입력한 test가 보이는군요!

그런데 lstrcatA가 보입니다 :D

lstrcat함수는 간략하게 설명해서 문자열을 이어붙여주는 기능을 합니다.

https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-lstrcata

 

lstrcatA function (winbase.h) - Win32 apps

Appends one string to another.Warning  Do not use.

docs.microsoft.com

lstrcatA는 취약점을 가진 함수네요!

어떤 취약점인지 이를 가지고 무엇을 할 수 있는지는 스스로 공부해보시길 바랍니다 :D

lstrcatA 2

ConcatString의 변수에 StringToAdd변수의 문자열이 붙여진걸 볼 수 있습니다!

그리고 계속실행하면 lstrcmpiA 함수가 보이네요 :D

lstrcmpiA

그러자 최종적으로 비교하는 것은

"test", "L2C-5781EqfqEngn4562-ABEX"

입니다!

 

그럼 정답이 무엇인지 짐작이 오시죠 :D?

성공

이렇게 성공했다는 메세지 박스를 받았습니다!

 

어떤 문자열의 암호화된 부분을 찾아내는 문제였네요 :D

이만 7번 문제 풀이를 마치겠습니다 !

'CTF > CodeEngn.kr' 카테고리의 다른 글

Basic RCE L09  (0) 2020.02.15
Basic RCE L08  (0) 2020.02.14
Basic RCE L06  (0) 2020.02.12
Basic RCE L05  (0) 2020.02.10
Basic RCE L04  (0) 2020.02.09