system 썸네일형 리스트형 c++ std::string c++ stdstring c++ std::string 클래스에 대해 정리해보려 한다.이걸 공부하게 된 계기는 std::__cxx11::basic_string::basic_string(v1)위와 같은 mangling된 c++ 함수를 분석하고자였다. 위 구문은 스택 오버플로우에서 std::string(v1)과 동일하다고 말하고 있다. 이 string 클래스는 우리가 일반적으로 문자열을 다룰 때 사용하는 char와는 차이가 있다. char형 배열, char형 포인터로 문자열을 다룰 때 char형 배열은 esp를 늘려 쭉 입력하는 형태이고 char형 포인터는 해당 주소에 문자열 주소를 가지고 있는 형태이다. string 클래스로 문자열을 다뤄보기 전에 구현부를 보고 가자. xxxxxxxxxxclass strin.. 더보기 2018 codegate baskinrobins31 baskinrobins31 2018 codegate baskinrobins31your_turn 함수에서 rop가 터진다.canary도 없고 계속해서 overflow가 터지므로 첫 번째 your_turn에서 libc를 leak하고 그 다음 turn에 system("/bin/sh")를 해주면 편하다.신경써야 할 것은 64비트 rop라는 것 뿐이다. from pwn import *e = ELF('./BaskinRobins31')s = process(e.path)l = ELF('/lib/x86_64-linux-gnu/libc.so.6')ru = lambda x: s.recvuntil(x)sl = lambda x: s.sendline(x)p = lambda : pause()io = lambda : s.inte.. 더보기 fastbin dup consolidate 정리 fastbin_dup_consolidate 정리 이번에 hitcon 문제를 풀면서 이 기법을 사용해봤는데 헷갈리는 점이 많았어서 정리한다. 이 기법을 설명하기 이전에 병합이 언제 일어나는지 알아야 한다.내가 여태까지 알기로는 병합은 두 경우에서 일어난다. inuse_bit flag가 존재하지 않는 chunk를 free했을 때 prev chunk와 consolidatelarge bin range chunk를 할당했을 때 fastbin chunk와 인접해 있는 경우 fastbin dup consolidate는 large bin range chunk를 할당했을 때 fastbin chunk와 인접해있지 않은 경우 fastbin chunk를 smallbin chunk로 이동시키는 것을 이용한 기법이다. xxxxx.. 더보기 2016 hitcon sleepyholder sleepyholder 2016 hitcon sleepyholder이 문제는 secretholder와 비슷하지만 다른점은 huge_secret이 처음에 할당만 할 수 있고 wipe, renew가 불가능하다는 점이다. 여기서 뭔 기법을 써서 풀어야할까 매우 고민했다. 큰 heap을 할당할 수 있으니 fastbin dup consolidate를 생각했는데, 나는 이 기법이 fastbin을 두 번 할당받고 싶을 때 사용하는 기법이라고만 생각했었는데 아니었다.이 기법을 이용하면 fastbin 크기를 smallbin으로 사용할 수 있는 놀라운 일이 벌어진다. 즉, fastbin으로 병합을 할 수 있다는 것이다.. 또한 secretholder에서 발견한 취약점인 nextchunk의 prev size를 바꿔줄 수 있.. 더보기 2016 hitcon secretholder secretholder 2016 hitcon secretholdersmall secret을 할당하고 쓸 때 40바이트 할당하므로 다음 chunk의 prev size를 덮을 수 있다. 전역 변수에서 각각의 heap address를 관리한다. -> unsafe unlink 물론 전역변수를 통해 입력도 받는다. 앞으로 힙오버만 있으면..! free할 때 전역 변수에 저장되어 있는 heap address를 초기화하지 않는다. -> 같은 곳을 여러번 해제 가능 huge chunk를 맨 처음으로 오게할 수 있다면 small_buf를 이용하여 free한 후 UAF를 일으킬 수 있다.그 다음부터는 fake chunk를 만들어 unsafe unlink를 trigger하고 free_got를 puts_plt로 덮어 leak.. 더보기 2017 secuinside ohce ohce 2017 secuinside ohceread_input 함수에서 32글자를 기준으로 input buffer의 길이가 오르락 내리락 한다. 우리의 input이 들어가는 변수는 ebp-0x20 영역이다. 즉 31글자를 넣으면 input buffer의 길이가 늘어나는 일 없이 ebp의 값을 leak할 수 있을 것이다. 근데 echo 함수를 보면 입력 받은 길이를 계산하여 그만큼만 SYS_write로 출력해 준다. 하지만 sub_40026D 함수 때문에 이조차도 회피할 수 있다. *v1이 있으면 계속해서 길이를 더해주는데 31글자를 넣을시 ebp까지 계산하므로 31글자를 넣고 38의 길이를 가질 수 있는 상황이 발생한다. A를 31글자를 넣었을 때 스택 상황은 위와 같다. reverse_echo로 이를.. 더보기 x86, x64 srop 정리 srop x86, x64 srop 기법을 정리한다.srop는 sigreturn return oriented programming으로, sigreturn system call을 사용하는 rop이다. 이 기법은 rop를 하기 위한 gadget이 부족할 때 요긴하게 사용할 수 있다. 이 기법을 이해하기 위해서는 user mode와 kernel mode에 대해 알아야 한다. 프로그램은 보안, 자원 관리 등의 이유로 user mode와 kernel mode를 왔다갔다 하면서 실행된다.user mode는 접근할 수 있는 영역이 한정적이며, kernel mode는 모든 자원에 접근할 수 있다. 아직 제대로 공부한 적이 없어서 정확히 어느 부분이 한정적인지는 모르겠다. 보통 kernel mode에서는 signal을 처.. 더보기 2016 codefate floppy floopy 2016 codegate floppy맨 처음에 floppy를 할당하는 코드이다. 다음부터는 v8이라는 변수를 통하여 floppy를 조작하게 된다. 즉, floppy struct가 스택영역에 써진다. write함수이다. data는 malloc한 곳에, description은 스택에 써준다. modify 부분의 description 입력에서 스택 오버플로우가 터진다. 위 스택 오버플로우를 통해 descrption, data 출력을 통한 leak이 가능하다. file 명령어로 봤을 떄는 dynamically linked였는데 코드를 보면 plt와 got가 존재하지 않는다. 그래서 동일한 보호 기법을 걸고 실행해서 확인해봤다. #include void main(){ printf("hello!\n").. 더보기 이전 1 ··· 9 10 11 12 13 14 15 16 다음