ພາເຮັດ Reverse Engineering ງ່າຍໆກັບ Quackme PicoCTF2018

ຫຼັງໆມານີ້ແອັດມິນໄດ້ສົນໃຈເລື່ອງ Reverse Engineering ຫຼື ການເຮັດວິສະວະກຳຍ້ອນກັບເລີຍພະຍາຍາມຊອກໂຈດທີ່ມາເຝິກທັກສະດ້ານນີ້ເຊິ່ງແນ່ນອນຖ້າເລີ່ມຕົ້ນເລື່ອງ Hacking ບ່ອນໜຶ່ງທີ່ໜ້າເໝາະສຸດໆກໍ່ຄື PicoCTF ນັ້ນເອງ. ແລະມື້ນີ້ແອັດມິນພາທຸກຄົນມາຜ່ານໂຈດ Quackme ໃນ PicoCTF 2018 ເຊິ່ງເປັນໂຈດປະເພດ R.E ກັນເນາະ!

ໂຈດກໍ່ຈະມີໄຟລ໌ main ໃຫ້ເຮົາກໍ່ໂຫຼດລົງມາເກັບໃນເຄື່ອງແລ້ວລອງກວດເບິ່ງວ່າມັນເປັນໄຟລ໌ຫຍັງ

ຈະເຫັນວ່າມັນເປັນໄຟລ໌ ELF 32-bit ເຮົາກໍ່ສາມາດເປີດ Linux ແລ້ວ Run ໂປແກມນີ້ໄດ້ເລີຍ

ເມື່ອ Run ໂປແກມແລ້ວກໍ່ຈະມີ output ອອກມາປະມານນີ້ໃຫ້ເຮົາກອກຂໍ້ມູນໃສ່ ໃນຮູບແອັດມິນກອກໃສ່ວ່າ ABCDEF ຫຼັງຈາກນັ້ນມັນກໍ່ສົ່ງ “That’s all folks” ບໍ່ມີຫຍັງເກີດຂຶ້ນ, ລອງໃສ່ A ເຂົ້າໄປ 400 ໂຕກໍ່ບໍ່ມີ error ຫຍັງອອກມາສະນັ້ນບໍ່ໜ້າຈະສາມາດເກີດ overflow ຫຍັງໄດ້.

ບາດນີ້ເຮົາມາແກະໂປແກມນີ້ເພື່ອເບິ່ງອົງປະກອບ ແລະ ຂັ້ນຕອນການເຮັດວຽກຕ່າງໆຂອງໂປແກມດ້ວຍເຄື່ອງມືຍອດນິຍົມ Ghildra ໂຕ Ghildra ນີ້ຈະ decompile ໂປແກມອອກເປັນ assembly ແລະ pseudo-code ເຮັດໃຫ້ງ່າຍຕໍ່ການວິເຄາະ.

ທຳອິດເຮົາມາວິເຄາະເບິ່ງ function main ເລີຍວ່າມີຫຍັງແດ່

ເບິ່ງຮູບຂະໜາດເຕັມ

ຈະເຫັນວ່າມັນມີແຕ່ສະແດງ output ອອກມາແລ້ວກໍ່ມີເອີ້ນໃຊ້ function do_magic() ນຳ
ເຮົາກໍ່ລອງຕາມເຂົ້າໄປເບິ່ງໃນ do_magic() ວ່າມີຫຍັງໃນ function ນີ້ແດ່

ໃນ do_magic() ກໍ່ຈະມີ pseudo-code ແນວນີ້ເບິ່ງຂ້ອນຂ້າງອ່ານຍາກແມ່ນບໍ ດຽວແອັດມິນແປງຊື່ໃຫ້ມັນເຂົ້າໃຈງ່າຍຂຶ້ນໃຫ້

ອ່ະ ອ່ານງ່າຍຂຶ້ນແລ້ວ! ເຮົາກໍ່ມາວິເຄາະມັນເລີຍວ່າໂຕ function ນີ້ມັນເຮັດຫຍັງແນ່.
ທຳອິດເລີຍແຖວທີ 11 ມັນມີການຮັບຄ່າຈາກ keyboard ເຮົາເກັບໄວ້ໃນໂຕປ່ຽນ my_input ແລ້ວກໍ່ມີການໃຊ້ malloc ເພື່ອຈອງພື້ນທີ່ໃນ memory.

ຫຼັງຈາກນັ້ນກໍ່ມີ ການປະກາດໂຕປ່ຽນ 2 ໂຕຄື x ແລະ count ສຳລັບໃຊ້ໃນ infinity while-loop
ແຕ່ຈຸດສຳຄັນຈະຢູ່ທີ່ແຖວ 26 ຈະມີເງື່ອນໄຂວ່າ

ຖ້າວ່າຄ່າແຕ່ລະໂຕໃນ greetMessage ເທົ່າກັບຄ່າ char ທີ່ໄດ້ມາຈາກແຕ່ລະໂຕໃນ my_input XOR sekrutBuffer
ຄ່າຂອງ x ກໍ່ຈະເພີ່ມຂຶ້ນເທື່ອລະ 1 ເມື່ອ x ມີຄ່າເທົ່າກັບ 0x19 ຫຼື 25 ໃນເລກຖານ 10 ມັນກໍ່ຈະອອກຈາກ loop ແລ້ວສະແດງວ່າ “You are winner!” ອອກມາໜ້າຈໍ

ເຫັນຈາກ pseudo-code ເຮົາກໍ່ຮູ້ແລ້ວວ່າ flag ທີ່ເຮົາຢາກໄດ້ນັ້ນມັນຕ້ອງໄດ້ເຮັດ greetMessage XOR sekrutBuffer ແລະເອົາແຕ່ 25 ໂຕເທົ່ານັ້ນເພາະ x ຈະຢຸດທີ່ loop ຮອບທີ 26 😉
ເຮົາກໍ່ທຳການໄປຫາຄ່າຂອງ greetMessage ແລະ sekrutBuffer ໃນ Ghildra

greetMessage = You have now entered the Duck Web, and you\’re in for a honkin\’ good time.\nCan you figureout my trick?

sekrutBuffer = 29 06 16 4f 2b 35 30 1e 51 1b 5b 14 4b 08 5d 2b 50 14 5d 00 19 17 59 52 5d 00

ເບິ່ງຮູບຂະໜາດເຕັມ

ຄ່າຂອງ sekrutBuffer ມັນຈະໄດ້ເປັນ hex
ຫຼັງຈາກໄດ້ຂໍ້ມູນມາຄົບແລ້ວແອັດມິນກໍ່ຂຽນ code ເພື່ອໃຫ້ຖອດລະຫັດເອົາ flag ເລີຍ

secret_buffer = bytes.fromhex("2906164f2b35301e511b5b144b085d2b50145d00191759525d00").decode('utf-8')
DATA = "You have now entered the Duck Web, and you\'re in for a honkin\' good time.\nCan you figureout my trick?"

for i in range(25):
	print(chr(ord(DATA[i]) ^ ord(secret_buffer[i])), end="")

ຜົນລັບທີ່ໄດ້ແມ່ນ

Frankkung

Frankkung

FULLSTACK DEVELOPER - PENETRATION TESTER