level1@io:/levels$ gdb -q level01Reading symbols from /levels/level01...(no debugging symbols found)...done.(gdb) disas mainDump of assembler code for function main: 0x08048080 :push $0x8049128 0x08048085 :call 0x804810f 0x0804808a :call 0x804809f 0x0804808f :cmp $0x10f,%eax 0x08048094 :je 0x80480dc 0x0804809a :call 0x8048103 End of assembler dump. (gdb) p 0x10f$1 = 271(gdb) qlevel1@io:/levels$ ..
xor를 할때 값에 0x00을 주면 자신이 나옴 0x50 ^ 0x00 = 0x50 그래서 keybuf의 값 128(sizeof int * 32)을 모두 0x00으로 주고 keybuf를 구했음. 사실 처음에 이 문제를 풀었을때는 system함수 구해서 풀었는데 IDA로 까보니까 execve.plt가 있었다. 그래서 .bss section에 read로 execve의 인자값이 될 "/bin/sh", {"/bin/sh", 0}를 만들어두고 execve의 인자값을 bss영역의 주소로 줬음 확실히 system 구하는것보다 깔끔하게 나옴
원래 C++에서도 C의 go-to 문과 같이 이슈가 되는것이 많지만 C++을 제대로 시작한지 매우 조금 됐기 때문에 필요하다 싶으면 닥치는 대로 가져가 썻다(....) //상속, 프렌드 등등 아무것도 모른다. C++에 익숙해지기 위해 만들었다.. 특히 std::bitset을 써서 8비트와 6비트씩 끊는걸 구현했는데 매우 만족스러웠다. 예전에 C에서 짯던 코드와 비교하면 확실히 깨끗해졌다. C++을 좀 더 공부해서 내가 만들고 싶은 프로그램을 만들고 싶다. Encrypted String : VkdocGMxOUpjMTlDUVZORk5qUmZSVzR2UkdWRGNubHdkRjlVYjI5c1gxOURLeXM9 Decrypted String : This_Is_BASE64_En/DeCrypt_Tool__C++
ASLR 걸려있고 buffer 주소를 출력해 주지 않는다. fusion 내부에 있는 ROPgadget 프로그램을 이용하면 jmp *%esp를 쉽게 찾을 수 있다. ret 바로 뒤 4바이트로 점프하게 되고 esi에 우리가 넣은 쉘코드가 위치하게 됨 ret뒤 4바이트에다 jmp *%esi opcode넣어주고 ret를 jmp *%esp로 주면 쉘 획득 가능 https://gist.github.com/err0rless/49c2b54554dc67fd2bb3