분류 전체보기 145

[CodeGate2017] Goversing

코드게이트 2017 문제인 것 같다. Go 로 만든 elf 파일에서 플래그를 찾는 것이 목적. Go 에 대한 이해가 너무 필요했다. Go 는 스택 기반 호출을 하는 언어로 함수를 호출할 때, 레지스터나 push를 쓰지 않고 스택에 데이터를 삽입 후 원하는 인자들을 그 스택 그대로 가져와서 함수호출 후에 쓴다. 또한 리턴 값을 저장하는데에 rax를 쓰지도 않는다. 확실한건 x86_64 calling convention 과는 다르다는 것이다. 이러한 부분들 때문에 IDA가 있어도 일일히 어셈블리를 보는 수 밖에 없었다. (헥스레이가 깨짐) 우선 Go에서 함수가 어떻게 동작하는지를 조금 살펴보았다. 위 사진은 Go로 작성한 소스코드, 아래는 그 소스에 대한 어셈블리 코드이다. 1번과 2번으로 소스를 나눠서 볼..

<보안 study>/CTFs 2019.07.29

[Pwnable.kr]shellshock

https://namu.wiki/w/%EC%85%B8%EC%87%BC%ED%81%AC 셸쇼크 - 나무위키 본격적으로 설명하기에 앞서 Bash의 환경변수에 대해 간략하게 알아보자. $ hi="안녕!" $ echo $hi 안녕!hi라는 변수를 생성, echo 함수를 통해 출력하는 구문이다. $hi를 입력했을 때 Bash shell은 c의 매크로처럼 "안녕!"이라고 변환해준다. $ hi="안녕!" $ export hi $ printenv | grep hi hi="안녕!"이번엔 변수를 선언하고 export를 통해 환경변수에 등록해보자. printenv로 환경변수 목 namu.wiki 꺼무위키에 설명이 잘 나와있었다. 취약점의 종류는 CVE-2014-6271 이다. bash에 대한 놀라운 소식이 있단다 ;; (s..

[Pwnable.kr]input

문제는 이렇다. 힌트가 될만한 건 없어보임. 들어가기에 앞서서, 이 문제는 pwntools의 소소한 사용법들을 많이 익힐 수 있었던 문제이다. 접속 후에 파일 목록을 보면 이렇다. C 소스를 주었다. 그 전에 우선 input 바이너리를 실행시켜보자. 문제에서는 프로그램에 input을 올바르게 넣으면 플래그를 준다고 한다. C소스를 보러가자. 우선 소스 맨 아래에 flag를 출력 시켜주는 함수 구문이 있다. 여기에 도달해야하는게 최종목표이다. 도달하기 까지 총 5단계의 과정이 있다. 첫 번째 단계이다. 바이너리에 argv 인자의 형태로 input을 잘 넣을 수 있는지 보는 과정이다. 우선 인자의 개수는 바이너리경로 포함 100개의 argv를 갖고있어야한다. (argc != 100) 그리고 argv['A']..

[Reversing.kr]ImagePrc

그래픽 관련 Windows API 를 공부할 수 있었던 문제이다. 그림을 그릴 수 있는 프로그램이 나오고 아무거나 그려서 Check를 누르면 틀렸다고 나온다. IDA로 디컴파일을 해보았다. WinMain 함수를 보면 메세지를 처리할 것만 같이 생긴 WndProc 함수가 나온다. (여담이지만 예전에 API 문제는 WndProc을 찾자는 공식(?)을 외웠던 것 같다...) 그리고 WndProc 내부를 살펴보면 bitmap 이미지를 다루는 함수들이 보인다. 우선 CreateCompatibleBitmap으로 가로 200 세로 150의 이미지 핸들(?)을 만들고CreateCompatibleDC 로 메모리핸들을 만든다. 그 후에 hdc에 가로 200 , 세로 150의 비트맵 이미지를 옮기고 BitBlt 함수로 윈도..

[C++]new와 참조자

new와 malloc 과 차별화 되는 특징은 바로 new로 메모리 공간을 할당하고 이름을 붙여준 곳을 변수로 간주할 수 있다는 것이다. 그래서 malloc과는 다르게 new 의 변수는 참조자로 참조가 가능하다. 소스로 공부하였다. #include#include#include#includeusing namespace std;typedef struct __Point {int xpos;int ypos;}Point;Point& PntAdder(const Point &p1, const Point &p2);int main(){Point * ptr1 = new Point;Point * ptr2 = new Point;ptr1->xpos = 1;ptr1->ypos = 2;ptr2->xpos = 3;ptr2->ypos =..

<C++ study> 2019.02.18

[C++]참조자를 이용한 Call-by-Reference

그냥 개인공부 끄적끄적글 C++ 에서는 함수에서 외부 선언 된 변수의 접근 방식이 두 가지가 있는데하나는 주소값(포인터)을 이용하는 것두 번째는 참조자(&)를 이용하는 것이다. 그리고 이 인자들을 어떻게 사용하느냐에 따라서Call-by-Value 와 Call-by-Reference가 갈린다. 간단하다. 인자를 참조하여서 값을 건드는 경우와 그냥 메모리 주소를 이용하는 것. 전자는 Call-by-Reference이고 후자는 Call-by-Value가 된다. 예제로 공부하였다. #include#include#include#includeusing namespace std;void SwapPointer(int *(&ref1), int *(&ref2)){cout

<C++ study> 2019.02.18

[Saudi and Oman CTF]Back to basics

초심으로 돌아가야하는 문제인데 못풀었다..;; curl 을 공부할 수 있는 좋은 기회가 되었다. http://35.197.254.240/backtobasics/ 문제에서는 굳이 브라우저로 열지않아도 된다고, 다른 방안이 있다고 한다. 다른 방안은 바로 curl (중간에 패킷 잡고 풀어도 상관없다.) 이다. 우선 url의 헤더를 보자. - i 옵션 : url의 헤더와 소스를 모두 보여준다.- I 옵션 : url의 헤더만 보여준다. HTTP 헤더에서 보기로는 HTTP 메서드 중에서 GET과 POST 모두를 허용한다고 한다.그러면 GET으로 전송해보자. -X 옵션 : HTTP 메소드를 변경시킬 수 있다. GET 은 일단 옳은 길이 아닌 듯. POST는 성공한 것 같다 ! flag= 이 보인다 ㅋㅋ 우선 저 h..

<보안 study>/CTFs 2019.02.14

[Saudi and Oman CTF]I love images

Write Up을 작성하기에 앞서 PNG 파일 구조에 관한 내용이 주가 될 것임을 말한다. PNG 형식의 로봇사진만 딸랑 한 개 있다.헥스뷰로 파일 구성을 보자. 우선 PNG 구조는 파일시그니처와 N개의 청크로 이루어져있다고 한다.청크의 구조는 이런 식이다.{ Length (4 byte), Chunk Type (4 byte), Chunk Data (length byte), CRC (4byte) }출처 : https://ryanking13.github.io/2018/03/24/png-structure.html 처음 4바이트 시그니처의 모습이다. 그리고 로봇사진의 파일구조 전체. 청크는 총 4개를 갖는다는 것을 알 수 있다. 이 중에서 PNG는 기본 IHDR , IDAT , IEND의 3개의 청크를 갖는데 ..

<보안 study>/CTFs 2019.02.14

[Evlz_ctf]find_me

단순한 crypto? reversing? 문제이다. 쉬어가는 타임 바이너리를 아예 실행하면 깨지게 만들었다. 직접 분석해보자. 마지막에 s2랑 어떠한 함수를 거쳐 나온 s1을 비교해서 맞으면 플래그인 것이고 아니면 말고.. s2를 살펴보자. 어떠한 문자열이 쭉 저장되어있다. s1 을 도출해주는 직전의 함수를 보자. 대강봐도 base 64 라는 느낌이 온다. 뭐 잘못짚은 셈 치고 디코딩 돌려보자. 음... web 공부하면서 봤었던 URL 인코딩이 되어있는 것 같기도..? 진짜 쭉 게싱 하면서 풀었었던 것 같다.. 쭉 가자.... 아마 두 번째 함수가 URL 인코딩이였을테니 첫 번째 함수만 보면 되겠다. ROT 몇 인지는 감이 잘 안오는데 rot 계열 인코딩 같다. 다 돌려보자. http://theblob...

<보안 study>/CTFs 2019.02.08
반응형