반응형
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
#include <stdio.h>
#include <stdlib.h>
 
void open_flag() {
  char flag[120];
  char email[] = "chanbin.lee123@gmail.com";
  FILE * file;
  file = fopen("flag.txt""r");
  if (file == NULL) {
    printf("Please contact %s, I couldn't find the flag file!\n", email);
    exit(0);
  }
  fgets(flag, sizeof(flag), file);
  printf("%s", flag);
}
 
int main() {
  long key = 0x00000000;
  char buf[10];
  printf("Can you change my key to 0x12345678?\n");
  printf("I can’t open the flag otherwise!\n");
  printf("My key value is: 0x%08x\n", key);
  printf("What do you think?\n> ");
 
  gets(buf);
  printf("\nMy key is: 0x%08x\n", key);
 
  If(key == 0x12345678) {
    printf("Whoa, you changed my key! Good job!\nHere's the flag:\n");
    open_flag();
    exit(0);
  }
 
  if (key == 0x00000000) {
    printf("My key didn't change! Try again.\n");
    return 0;
  }
 
  printf("You're close! Keep trying.\n");
  return 0;
}
 
cs


hints

On a stack, where are the variables stored and in what order?

How big is the buffer? Does the program care about how long your input is?

What happens if you give an input bigger than what’s expected?

What are endians?



반응형

'STUDY > Documentation' 카테고리의 다른 글

Debugging your ROP  (0) 2019.02.18
해커스쿨 문서 백업 (Syshacks)  (0) 2019.02.17
Bufferoverflow 기법 정리  (0) 2015.09.22
핸드레이  (0) 2015.09.05
strace, 제가 한번 사용해 보겠습니다.  (0) 2014.07.22
반응형

Print your payload:

print payload


Pipe it into a file:

EverTokki@pico-2018-shell:~/rop$ python test.py > input


Breakpoint where your program returns:

EverTokki@pico-2018-shell:~/rop$ gdb -q gets

Reading symbols from gets...(no debugging symbols found)...done.

gdb-peda$ b *0x080488a2

Breakpoint 1 at 0x80488a2


Run it with your payload:

gdb-peda$ r < input

Starting program: /home/EverTokki/rop/gets < input

GIVE ME YOUR NAME!


Display your current pc (instruction): 

Breakpoint 1, 0x080488a2 in vuln ()

gdb-peda$ disp/3i $pc 

1: x/3i $pc

=> 0x80488a2 <vuln+38>: ret    

   0x80488a3 <main>: lea    ecx,[esp+0x4]

   0x80488a7 <main+4>: and    esp,0xfffffff0


Step into instructions:
gdb-peda$ si


Keep watching your registers and note when it screws up.


반응형

'STUDY > Documentation' 카테고리의 다른 글

Simple BOF Problem  (0) 2019.04.10
해커스쿨 문서 백업 (Syshacks)  (0) 2019.02.17
Bufferoverflow 기법 정리  (0) 2015.09.22
핸드레이  (0) 2015.09.05
strace, 제가 한번 사용해 보겠습니다.  (0) 2014.07.22
반응형

Double_Staged_Format_String_Attack__pwn3r.pdf

Olly Debugger 사용 방법 강좌 2부.hwp

bof_fsb.hwp

remote_overflow2.pdf

remote_overflow1.pdf

code_exec.pdf

Olly Debugger 사용 방법 강좌 1부.hwp

asm_beginner.pdf

buf_overflow_techniques.pdf

fsb_howto.pdf

craft_shellcode.pdf

exploit_using_unfinished_str.pdf

fileread_race.pdf

datastructures.pdf

fsb원리.pdf

semaphores.pdf

fsb.pdf

ret-t-lib.pdf

BOF_strace.hwp


약간 유통기간(?)이 지난 문서들도 있겠지만 읽을 문서들이 필요했고,

해커스쿨 플래시 인터페이스는 2005년에는 멋있었겠지만 2019년에는 경악을 금치 못하는 수준이라

슬며시 재미있어보이는것들만 따와서 여기 올린다.


https://www.hackerschool.org/HardwareHacking/

여기도 재미있어보이지만 하드웨어는 일단 소프트웨어부터 익숙해진 후에 시도해보려 한다.

흠..배고프다

반응형

'STUDY > Documentation' 카테고리의 다른 글

Simple BOF Problem  (0) 2019.04.10
Debugging your ROP  (0) 2019.02.18
Bufferoverflow 기법 정리  (0) 2015.09.22
핸드레이  (0) 2015.09.05
strace, 제가 한번 사용해 보겠습니다.  (0) 2014.07.22
반응형

https://docs.google.com/document/d/15d3f0ZEKxYXsrUNybTQlONGyxY9MVhb8NgDJAPNRCkU/edit?usp=drive_web


나름 공들여서 썼었던 기억이 난다. 기말고사 기간동안...

반응형

'STUDY > Documentation' 카테고리의 다른 글

Debugging your ROP  (0) 2019.02.18
해커스쿨 문서 백업 (Syshacks)  (0) 2019.02.17
핸드레이  (0) 2015.09.05
strace, 제가 한번 사용해 보겠습니다.  (0) 2014.07.22
Buffer Overflow  (3) 2014.05.18
반응형


작년에 한동안 학교다니면서 짬짬히 했었던거. 쏟은 시간에 비해 결과물은 비루하다. 오랜만에 파일정리하고있었는데 나오드라. 나중에 시간되면 갖고있는 나머지도 다 해봐야될듯. 근데 이거 두 개 하고서는 꽤나 어셈에 대한 두려움이 없어져갖고 신기했었다. 뭐든지 다 읽을 수 있는기분ㅋ 

요즘은.. 어셈보면.. 심란하다...


그리고 누누히 말하지만 나는 포인터들이 싫다. (정색)


re(完).docx

re3(完).docx






반응형

'STUDY > Documentation' 카테고리의 다른 글

해커스쿨 문서 백업 (Syshacks)  (0) 2019.02.17
Bufferoverflow 기법 정리  (0) 2015.09.22
strace, 제가 한번 사용해 보겠습니다.  (0) 2014.07.22
Buffer Overflow  (3) 2014.05.18
Key File  (0) 2014.05.16
반응형

http://www.linuxintro.org/wiki/Strace 를 참고하겠습니다!


저는 지금 이 글을 쓰는 지금 strace를 전혀 쓸줄 모름니다. strace <file>로 실행시킬 수 있다는거밖에 모름.

자 그렇다면 같이 해봅시다. 헬로월드 프로그램을 짜서 분석해보죠

[nightmare@localhost nightmare]$ cat hello.c

#include<stdio.h>

int main()

{

printf ("Hello, World!\n");

return 0;

}


컴파일하고 strace ./파일명 으로 우선 결과물을 출력해줍시다.


[nightmare@localhost nightmare]$ strace ./hello

execve("./hello", ["./hello"], [/* 22 vars */]) = 0

brk(0)                                  = 0x8049548

old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40014000

open("/etc/ld.so.preload", O_RDONLY)    = -1 ENOENT (No such file or directory)

open("/etc/ld.so.cache", O_RDONLY)      = 3

fstat(3, {st_mode=S_IFREG|0644, st_size=12210, ...}) = 0

old_mmap(NULL, 12210, PROT_READ, MAP_PRIVATE, 3, 0) = 0x40015000

close(3)                                = 0

open("/lib/libc.so.6", O_RDONLY)        = 3

fstat(3, {st_mode=S_IFREG|0755, st_size=4101324, ...}) = 0

read(3, "\177ELF\1\1\1\0\0\0\0\0\0\0\0\0\3\0\3\0\1\0\0\0\210\212"..., 4096) = 4096

old_mmap(NULL, 1001564, PROT_READ|PROT_EXEC, MAP_PRIVATE, 3, 0) = 0x40018000

mprotect(0x40105000, 30812, PROT_NONE)  = 0

old_mmap(0x40105000, 16384, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED, 3, 0xec000) = 0x40105000

old_mmap(0x40109000, 14428, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_FIXED|MAP_ANONYMOUS, -1, 0) = 0x40109000

close(3)                                = 0

mprotect(0x40018000, 970752, PROT_READ|PROT_WRITE) = 0

mprotect(0x40018000, 970752, PROT_READ|PROT_EXEC) = 0

munmap(0x40015000, 12210)               = 0

personality(PER_LINUX)                  = 0

getpid()                                = 1120

fstat64(0x1, 0xbffff364)                = -1 ENOSYS (Function not implemented)

fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 0), ...}) = 0

old_mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x40015000

ioctl(1, TCGETS, {B9600 opost isig icanon echo ...}) = 0

write(1, "Hello, World!\n", 14Hello, World!

)         = 14

munmap(0x40015000, 4096)                = 0

_exit(0)                                = ?


"To analyze strace's output you must know that the first keyword in a line of output from strace is always a syscall like open or read. Then, in parantheses, the arguments follow, then the result. "

우선 strace의 출력의 첫 키워드는 시스템콜이고, 괄호안에는 전달되는 인자라네여. 그리고 뒤에 결과가 따른다고 합니다. 아마 뒤에 = 한게 결과겠죠?

ㅋㅋ맞다고 써있네요.


"Every line follows the syntax

syscall(arguments) = return value

친절하게 시스템콜이 어떤 동작을 하는지 모르겠다면 man 2 <systemcall>이렇게 찾아보라고도 하네요.

어.. 근데 생각해보니 이게 다네요?

헐?

끗.


근데 old_mmap랑 mmap 랑 munmap 랑 같은거 같은데 뭘 하는지는 잘 감이 잡히지 않네요. 근데 왜 그동안 strace..이걸 안쓰려고 했나 모르겠ㅅ브니다. 역시 하고봐야 되는듯. 그동안 무서워서 못건드렸거든옄ㅋㅋㅋㅋㅋㅋㅋㅋ 이런..


++) mmap는 근데 메모리에 어떤 장치가 사용할 메모리를 할당해주는 것인 것 같은데, 그렇다면 각각 함수, 즉 open 이나 read, write같은 함수가 사용하는 공간을 만들어주는 것인가요? 위에 strace를 보면 각각 함수들 실행시키기 전에 하나씩 있는걸 보니..

반응형

'STUDY > Documentation' 카테고리의 다른 글

Bufferoverflow 기법 정리  (0) 2015.09.22
핸드레이  (0) 2015.09.05
Buffer Overflow  (3) 2014.05.18
Key File  (0) 2014.05.16
Frame Pointer Overwrite/One Byte Overflow  (5) 2014.04.06
반응형

조금 너무 간결한 개념설명(정리)

RedHat 6.2 기준 스택 버퍼오버플로우에 대한 글 입니다.

모든 지적 다 감사히 받습니다


정말 개념만 설명하고 싶었습니다. 가장 기본적인 것들만 적어놓았으니 이런 개념이구나 참고만 하시기 바랍니다 :)


[1] Buffer Overflow (BOF)

#include<stdio.h>

main(int argc, char *argv[])

{

char buffer[40];

strcpy(buffer, argv[1]);

printf("%s\n", buffer);

}


이런 코드가 있을 때 메모리의 상황은

(낮은 주소)[buffer(40 bytes)] [(Saved)Frame Pointer(4 bytes)] [Return Address(RET) (4bytes)](높은 주소)

이렇게 되게 된다.  (스택이 자라는 방향: 낮은주소 ← 높은주소, 스택은 LIFO(Last-In-First-Out))


*)SFP(Saved Frame Pointer)란?- 처음에 함수 프롤로그(push %ebp)에 의해 저장된 EBP의 값이다 (함수에서 지역변수들이 사용될 때 그 기준으로 EBP가 쓰이는데 타 함수로 넘어갈 경우 다시 돌아왔을 때 ebp를 복귀시켜야 하니 저장해두는 값. 함수가 시작했을때 당시 최초의 EBP 주소를 가리키고 있다)

*)RET(Return Address)란?- EIP(Extended Instruction Pointer)가 가리킬 곳을 가르쳐주는 주소값. EIP는 프로그램이 끝난 후 돌아갈 주소를 가지고 있다.


위의 소스에서 strcpy때문에 버퍼오버플로우가 생기게 되는데, 만약에 버퍼(유저입력으로) 48바이트를 넣는다면 유저의 입력이 버퍼인 40바이트 뿐만아니라 버퍼 뒤에 있는 SFP와 RET까지 덮어버려 프로그램의 실행을 바꾸기 때문이다. RET는 EIP, 즉 함수 실행이 끝난 뒤 어디로 EIP가 가야 할 지 가르쳐주는 역할을 가지고 있기 때문에 만약에 사용자가 RET를 덮어쓴다면 사용자가 입력한 주소로 프로그램의 실행이 계속 되게 된다. 이를 이용해 버퍼에 쉘코드를 넣고 RET를 버퍼의 시작 주소값 또는 NOPSLED 중 하나의 주소값으로 설정한다면 EIP는 버퍼로 가 쉘코드를 그대로 실행하게 된다.


예시:

Payload= "\x90"x20bytes, "Shellcode"x24bytes, "Buffer Address"x4bytes


*)NOPSLED란?- NOP(No OPeration)는 (Intel x86 CPU기준으로)"\x90"을 뜻하는데, 이 명령은 아무 동작도 하지 않고 다음 명령으로 넘어가라는 뜻이다. 만약에 NOP가 900개 있고 그 후에 쉘코드가 있다면 ESP(Extended Stack Pointer- 실행하는 명령을 가르키는 포인터)는 NOPSLED(미끄럼틀같이) 아무 명령도 실행하지 않고 계속 진행하다가 마지막에 있는 쉘코드를 실행하게 된다.

*)Little Endian이란?- 엔디안은 메모리에 수를 저장하는 방식인데, 차이점은 빅 엔디안과 리틀 엔디안에 12345678을 넣게 된다면, 빅 엔디안(이 방식을 쓰는 컴퓨터는 별로 없다)은 12 34 56 78로 메모리에 적재하는 반면 리틀 엔디안은 뒤에서부터 78 56 34 12 이렇게 두바이트씩 끊어 거꾸로 넣게 된다. 고로 리턴 어스레스 같은 경우에도 페이로드에 거꾸로 뒤집어 준 후 넣어야 한다. \x~~\x~~\xff\xbf <- 이런 식

설명은 <http://itguru.tistory.com/71>을 참고했습니다



[2] Return-to-Libc (RTL)

Libc란 공유 라이브러리를 뜻한다. 이 공유 라이브러리는 프로그램이 호출될 때 사용되는 함수를 포함하고 있으며 프로그램이 언제든지 함수를 호출할 때 사용된다.

아까와 같은 코드가 있다면, (위에서 다시 가져와보자)

#include<stdio.h>

main(int argc, char *argv[])

{

char buffer[40];

strcpy(buffer, argv[1]);

printf("%s\n", buffer);

}

물론 아까처럼 버퍼오버플로우를 사용하여 공격할 수도 있다. 하지만 이번에는 Libc를 사용해 공격해볼 것이다.

쉘을 따려면 system("/bin/sh");를 실행시키면 된다

프로그램을 gdb로 메인에 브레이크포인트(b main)를 건 후, 실행시킨 후 브레이크포인트에서 p system을 하면 system함수의 주소가 나온다.

RET를 이 시스템 함수의 주소로 하고, 그 후 4바이트 뒤에 &"/bin/sh" (/bin/sh의 주소) 를 넣으면 system이 ebp+8부터 인자를 참조하기 때문에 system("/bin/sh"); 를 실행하게 된다.

ebp+4에는(system함수 주소 뒤, /bin/sh주소 앞) 더미를 넣거나, 깔끔하게 끝내고 싶다면 exit의 주소를 넣으면 된다. 이곳은 system실행 후 돌아갈 ret을 저장하는 곳이기 때문이다.

예시:

Payload= "\x90"x44bytes, "system address"x4bytes, "exit address"x4bytes, "/bin/sh address"x4bytes



[3] RTL Chaining (Chaining RTL Calls)

RTL Chaining, 이건 위의 RTL과 비슷한 개념이다.

만약에 위와 같은 코드에 strcpy를 두번, system을 한번 이렇게 연속으로 실행하고 싶다고 가정해보자.(걍 머리에 떠오르는 함수,...)

그렇다면 이것들을 어떻게 실행시켜야 할까?

strcpy의 인자는 2개(char *dest, const char *source)이다. 인자가 하나라면 (function) (function) (argv) (argv) 이렇게 끼워서 두 번 실행시킬 수 있겠지만, 늘 함수 주소 뒤의 4바이트를 인자로 참조하기 때문에 인자가 2개인 strcpy는 1번 이상 사용할 수 없다.

&strcpy &strcpy(x) &dest &source <...어떻게 전달하지?>


RTL Chaining을 사용하면 된다!!(??뜬금 느낌표)

우선 개념도를 적어놓겠다.

&strcpy &poppopret &dest &source &strcpy &poppopret &dest &source &system &exit &/bin/sh

pop- Stack에서 데이터를 빼는 것 말고도 pop는 esp+4를 하게 되기 때문에 다음 인스트럭션을 가르키게 된다. 이 경우에는 가젯이 pop pop ret이기 때문에 strcpy를 실행하고 인자를 두 개 전달한 뒤, pop pop ret을 이용해 두 인자를 건너뛰고 그 뒤에 있는 두 번째 strcpy의 주소를 ret하여 다시 실행하게 되는 것이다.

*)가젯(Gadget)이란?- 프로그램 내부의(함수에) 기계어로 된 ret로 끝나는 코드의 조각으로써 필요한 가젯을 찾아 공격자의 마음대로 사용하면 된다

만약에 건너뛰어야 하는 인자가 3개라면, pop pop pop ret, 하나라면 pop ret을 찾아 사용하면 되는 것이다.


[4] SFP overwrite (One-byte Overflow)


[5] Fake EBP (FEBP)

<기말공부다하고돌아오겟슴니다>


반응형

'STUDY > Documentation' 카테고리의 다른 글

핸드레이  (0) 2015.09.05
strace, 제가 한번 사용해 보겠습니다.  (0) 2014.07.22
Key File  (0) 2014.05.16
Frame Pointer Overwrite/One Byte Overflow  (5) 2014.04.06
[CodeGate Junior Quals] RunCommand 250  (0) 2014.04.06
반응형

narnia 0 efeidiedae

narnia 1 nairiepecu

반응형

'STUDY > Documentation' 카테고리의 다른 글

strace, 제가 한번 사용해 보겠습니다.  (0) 2014.07.22
Buffer Overflow  (3) 2014.05.18
Frame Pointer Overwrite/One Byte Overflow  (5) 2014.04.06
[CodeGate Junior Quals] RunCommand 250  (0) 2014.04.06
MISCCCCCCCCCC!  (0) 2014.03.11

+ Recent posts