Hack/Pwnable
-
Helper PythonHack/Pwnable 2018. 10. 22. 12:30
from idautils import *from idc import * const_startEA = [] # const startEAconst_endEA = [] # const endEA got_startEA = [] # got startEAgot_endEA = [] # got endEA stubs_startEA = [] # stubs startEAstubs_endEA = [] # stubs endEA #set_name(0xFFFFFFF0070015C0,"gggg") def get_const_seg():image_base = idaapi.get_imagebase()end_addr = MaxEA()start_addr = image_basewhile True:next_seg_addr = NextSeg(sta..
-
ASIS CTF 2018 TinypwnHack/Pwnable 2018. 8. 30. 01:23
@markdown 보고서쓰고 문제만들고 하면서 열났던 머리를 식히기 위해 전에 풀었던 문제 롸이트업이나 적어보려 한다.```xor rax, raxxor rbx, rbxxor rcx, rcxxor rdx, rdxxor rdi, rdixor rsi, rsixor r8, r8xor r9, r9xor r10, r10xor r11, r11xor r12, r12xor r13, r13xor r14, r14xor r15, r15xor rbp, rbpcall sub_4000F2mov eax, 60xor rdi, rdi ; error_codexor rsi, rsixor rdx, rdxsyscall ; LINUX - sys_exit``` 모든 레지스터를 0으로 초기화하고 sub_4000F2함수를 호출한 뒤 exit 시스콜을..
-
Shallow Copy 문제점Hack/Pwnable 2018. 1. 29. 17:19
Shallow Copy한국말로는 얕은 복사라고 하고, 반대의 복사방법은 Deep Copy, 깊은복사라고 한다.우선 아래 코드를 보자#include #include #include #include using namespace std; class Person { public: int age; char *name; public: Person(int _age, char *_name) { age = _age; name = new char [strlen(_name)+1]; strcpy(name,_name); } Person(const Person& s) { age = s.age; name = s.name; } ~Person() { // delete name; } void printPerson(..
-
File Stream Pointer에 관한 글Hack/Pwnable 2017. 1. 24. 14:53
일단 글 쓰면서 생각하는건 내일 일본을 가는데 저가 항공이여서 비행기 사고가 날 가능성이 있어 이렇게 유적을 좀 남기고자 함 Exploit을 다루지는 않을거같다.. 아직 문제가 몇개없고 최근에 풀어본문제가 pwnable.tw의 '어떠한' 문제인데, 워게임은 삽질해가면서 배우는거고, 풀이는 공식적으로 공유하지않는게 예의, 코래서 해당 주제로 작성된 한글문서도 없고 외국문서도 많이없길래 한번 작성해보려고 해요 File Stream Pointer는 일단 기본적으로 알고있듯이 파일로 버퍼를 슥삭슥삭하는 거다. fopen,fwrite,fread 등 수 많은 함수가있지만 이걸 다 적기엔 모든 함수를 다 사용해봐야 해서 이게 fp를 얻었을때 어떻게 동작하는지 볼 예정... 여기서 다루는 모든 예제는 16.04 LTS..
-
nc서버 열기 (XINETD)Hack/Pwnable 2016. 12. 19. 00:11
xinetd 서비스는 nc를 돌려줄수있음 앞으로모르는사람을위해 일일히설명하는거보다 링크던져주기위해 하나쓰겠습니다 일단 아래와 같은 명령으로 설치하면됨 apt-get install xinetd 깔아 줬으면 /etc/xinetd.d/ 디렉터리가 생길거다. 그러면 이안에 파일을 하나작성해주자 vi /etc/xinetd.d/서비스이름 그리고나서 아래와같은스크립트를 넣어주자 service 서비스이름{ disable = no flags = REUSE socket_type = stream protocol = tcp user = root wait = no server = 바이너리경로 } ex service prob1{ disable = no flags = REUSE socket_type = stream protocol..
-
malloc large_chunk exploit scenarioHack/Pwnable 2016. 12. 2. 21:10
이것은 여전히 시나리오다! 이전에 small bin에서는 unsafe_unlink를 적용할때 fd와 bk를 P와 비교해서 corruption error를 띄우던가 했었는데 malloc코드를 계속보던중 해당 루틴을 발견했다. 이거에 대해서 문제를 하나 만들어봐야겠다. 이것역시, smallbin의 범위에서 벗어나 large chunk가 할당되고, p->fd_nextsize와 p->bk_nextsize를 비교한다. 그럼 unsafe_unlink를 할때 fd_nextsize와 bk_nextsize를 주물러주면되겠군 크크 일단 main_arena+88 들어가는곳을 맞춰줘야하는것이 문제인데, 이경우에선 unsorted bin에서의 문제이니 상관없고, 만약 이걸 노린 문제가 생긴다면 릭한후 맞춰주는 식으로 하면 간단..
-
malloc - do_check_inuse_chunk()Hack/Pwnable 2016. 12. 1. 04:31
chunk가 있는지 검증하고, 청크가 맵핑되어있으면 return 시킴. 현재 청크의 inuse가 0이면 Abort를 띄우고, 다음 청크의 포인터값을 next에 집어넣는다. 이제 여기서가 핵심인데, 아래 코드를 보자 if (!prev_inuse(p)) { mchunkptr prv = prev_chunk(p); assert(next_chunk(prv) == p); do_check_free_chunk(av, prv);} 해당 청크의 prev_inuse가 0이면 해당 분기문을 타게되는데, prv 구조체변수에 아래와 같은 값이 들어간다. #define prev_chunk(p) ((mchunkptr)( ((char*)(p)) - ((p)->prev_size) )) 인자로받은 청크에서 prev_size값을 뺀다. 이..
-
malloc - do_check_free_chunk()Hack/Pwnable 2016. 12. 1. 04:13
do_check_free_chunk는 해당 청크가 free되있는지를 판단한다. 전 글에서 설명한 do_check_chunk로, av와 p를 검사하는데, av는 malloc_state 구조체이다. 만약 해당 청크의 prev_inuse가 1이라면 Abort를 띄우고, 맵핑되어있다면 Abort를 띄운다. 이 함수는 free되어있는지 체크하는 함수이기때문에 당연히 이래야함! 만약에 청크의 size가 MINSIZE보다 크면 첫번쨰 분기문을 타게되는데, 엄청나게 많은것을 따진다. 간단하게말하면, 다음청크의 prev_size가 현재 청크의 size인지 비교하고, 아니면 Abort를 띄운다. 그리고 prev_inuse가 0인지 1인지를 비교하고 0이면 Abort를 띄운다. 제일 중요한건 Unlink와 비슷한게 있는데,..